Члены сущности должны быть примитивными типами данных или типами данных Java? - PullRequest
19 голосов
/ 25 февраля 2010

Есть ли разница в объявлении включенной переменной как Boolean или Boolean? Что предпочтительнее с точки зрения использования памяти.

@Entity
class User {

     @Column
     Boolean enabled;
}

Ответы [ 3 ]

24 голосов
/ 27 февраля 2010

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

  1. правда
  2. ложь
  3. 1008 * нуль *

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

private Integer age;

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

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

13 голосов
/ 25 февраля 2010

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

9 голосов
/ 25 февраля 2010

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

Это из Hibernate FAQ:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...