Членами сущностей должны быть примитивные типы данных или типы данных Java?
Есть ли разница в объявлении включенной переменной как Boolean или boolean? Что предпочтительнее с точки зрения объема памяти.
@Entity
class User {
@Column
Boolean enabled;
}
Ответы
Ответ 1
Они оба будут сопоставляться с тем же типом столбца. С точки зрения памяти, примитив, вероятно, будет немного легче, но разница почти наверняка будет незначительной. Я думаю, что примитив сделает его непустым, но вы также можете сделать это с помощью аннотации.
Ответ 2
Я обычно предлагаю использовать примитивные типы, просто чтобы избавиться от нулевых проверок по всему месту. Но это действительно зависит от того, что вы хотите сказать. Теперь ваш Boolean может содержать 3 значения:
И null может создавать полную новую семантику при работе с объектами. Обычно я использую его как "Нет данных". Ваш "включен" может быть плохим примером для такого рода полей. Но позвольте сказать, что у вас есть число, которое содержит возраст человека.
private Integer age;
Когда вы используете null, вы можете рассматривать это как: "Неизвестно". Вы также можете использовать int и определить специальное значение (-1) для этого случая, но null является более естественным решением.
Итак, подведем итог. Использовать примитивы, если всегда есть значимое значение (обязательные поля?) И классы-оболочки для необязательных значений.
Ответ 3
Kaleb right - если какие-либо запросы возвращают нулевое значение для "enabled" (в этом случае), вы должны использовать объект, а не примитив.
Это из Hibernate FAQ:
Свойство PropertyAccessException часто возникает, когда объект, передаваемый методу setter, имеет неправильный тип. Проверьте сопоставления типов для нарушающего свойства. (Чтобы узнать, какое именно свойство было проблемой, вам может потребоваться отключить оптимизатор отражения CGLIB.) Однако наиболее распространенной причиной этой проблемы является то, что Hibernate попытался присвоить значение null первообразному типу.
Если ваш объект имеет свойство примитивного типа, сопоставленное с нулевым столбцом базы данных, вам нужно будет использовать собственный тип Hibernate для назначения разумного значения по умолчанию (примитив) для случая значения нулевого столбца. Лучшим решением, как правило, является использование типа оболочки для свойства Java.
https://www.hibernate.org/116.html