Подтвердить что ты не робот

Использование обертки. Integer класс или int-примитив в спящем режиме.

В компании, в которой я работаю, мы обсуждаем это основное обсуждение того, следует ли лучше использовать классы упаковки для примитивов (java.lang.Integer, java.lang.Long) или использовать примитивные типы непосредственно в POJO, которые отображают объекты в таблицы в спящем режиме.

Идея состоит в том, что мы хотим, чтобы эти значения не были нулевыми в базе данных.

Аргументы в пользу использования примитивов:

  • Обработка этих значений как int означает, что они никогда не могут быть нулевыми, в этот способ делает невозможным непреднамеренное получение нулевой ссылки на поле.
  • int = 32/64 бит памяти. Integer = 16 байт памяти и также медленнее

Аргументы в пользу использования объектов-оболочек:

  • Мы можем добавить ограничение на уровне базы данных, чтобы всегда предотвращать значения от получения там
  • Мы можем в итоге ввести вводящие в заблуждение данные, мы можем имеют 0 вместо нулей в базе данных всякий раз, когда пользователь не делает установить значение, а данные с ошибкой - сложный улов.
  • Объекты обладают большей выразительностью, чем примитивы. У нас есть нулевые значения, а также целочисленные значения, поэтому мы можем упростить их проверку, используя аннотации для пример (javax.validation.constraints.NotNull).
4b9b3361

Ответ 1

Используйте обертки, сделайте вашу жизнь простой.

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

Если они имеют значение NULL в базе данных, используйте обертки. Если они не имеют значения NULL, и вы используете обертки, тогда вы получите исключение, если попытаетесь вставить нуль в базу данных.

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

Я также запрошу ваше утверждение о том, что оно будет менее результативным. Вы измерили это? Я имею в виду, что он действительно измерил это? Когда вы разговариваете с базой данных, существует гораздо больше соображений, чем разница между 16 битами и 32 битами.

Просто используйте простое, последовательное решение. Используйте обертки повсюду, если кто-то не дает вам очень веской причины (с точной статистикой) делать иначе.

Ответ 2

Подумал, что нужно упомянуть:

Рекомендация Hibernate (раздел 4.1.2), использующая непримитивные свойства в постоянных классах, на самом деле ссылается - как на идентификационные свойства :

4.1.2. Предоставить свойство идентификатора

У Cat есть свойство, называемое id. Это свойство сопоставляется с столбцом первичных ключей таблицы базы данных. Свойство могло быть названо чем угодно, и его тип мог быть любым примитивным типом, любым примитивным типом "обертка", java.lang.String или java.util.Date.

...

Мы рекомендуем вам декларировать свойства идентификатора с одинаковым именем в постоянных классах и использовать тип с нулевым значением (т.е. не примитивный).

Тем не менее, преимущества примитивов невелики:

  • Наличие несогласованного ненулевого значения в свойстве хуже, чем NullPointerException, так как скрытая ошибка сложнее отслеживать: больше времени будет проходить, поскольку код записывается до тех пор, пока проблема не будет обнаружена, и она может появиться в совершенно другом контекст кода, чем его источник.
  • Что касается производительности: перед тестированием кода - это, прежде всего, преждевременное рассмотрение. Безопасность должна быть первой.

Ответ 3

Hibernate documentation (только первая версия, которую я нашел):

Свойство могло быть вызвано чем угодно, и его тип мог быть любым примитивным типом, любым примитивным типом "обертка", java.lang.String или java.util.Date.

...

Мы рекомендуем вам декларировать свойства идентификатора с одинаковым именем в постоянных классах и использовать тип с нулевым значением (т.е. не примитивный).

Таким образом, "экспертный голос" предлагает использовать Integer/Long... но это не описано, почему это так.

Интересно, может ли это так, что объект, который еще не был сохранен, может быть создан без идентификатора (т.е. со значением свойства null), отличая его от сохраняемых объектов.