Участники объекта они должны быть типы данных Java или примитивные типы данных?

Существует ли различие в объявлении включенной переменной как булевская переменная или булевская переменная? Который предпочтителен с точки зрения объема потребляемой памяти.

@Entity
class User {

     @Column
     Boolean enabled;
}
20
задан Sam 25 February 2010 в 04:26
поделиться

3 ответа

Они оба будут отображаться на один и тот же тип столбца. С точки зрения памяти, примитив, вероятно, будет немного легче, но разница почти наверняка будет незначительной. Я думаю, что примитив сделает его ненулевым, но это можно сделать и с помощью аннотации.

14
ответ дан 29 November 2019 в 23:27
поделиться

Калеб прав - если какие-либо запросы возвращают нулевое значение для "enabled" (в данном случае), то вы должны использовать объект, а не примитив.

Это из FAQ по Hibernate:

PropertyAccessException часто возникает, когда объект, передаваемый методу setter, имеет неправильный тип. Проверьте сопоставление типов на наличие ошибочного свойства. (Чтобы узнать, с каким именно свойством возникла проблема, вам может понадобиться отключить оптимизатор отражений CGLIB). Однако наиболее распространенной причиной этой проблемы является то, что Hibernate попытался присвоить null свойству примитивного типа.

Если ваш объект имеет свойство примитивного типа, сопоставленное со столбцом базы данных с возможностью присвоения нуля, то вам придется использовать пользовательский тип Hibernate для присвоения разумного значения по умолчанию (примитивного) для случая нулевого значения столбца. Лучшим решением обычно является использование оберточного типа для Java-свойства.

https://www.hibernate.org/116.html

9
ответ дан 29 November 2019 в 23:27
поделиться

Я обычно предлагаю использовать примитивные типы, просто чтобы избавиться от повсюду нулевых проверок. Но это действительно зависит от того, что вы хотите сказать. Теперь ваше логическое значение может содержать 3 значения:

  1. true
  2. false
  3. null

И null может создать совершенно новую семантику при работе с объектами. Я обычно использую это как «Нет данных». Ваше "enabled" может быть плохим примером для такого рода полей. Но допустим, у вас есть число, которое показывает возраст человека.

private Integer age;

Когда вы используете null, вы можете трактовать это как «Неизвестно». Вы также можете использовать int и определить специальное значение (-1) для этого случая, но null является более естественным решением.

Итак, подведем итоги. Используйте примитивы, если всегда есть значимое значение (обязательные поля?) И классы-оболочки для необязательных значений.

24
ответ дан 29 November 2019 в 23:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: