Примитив или shell для первичных ключей спящего режима

Я изучал различные учебные пособия по спячке и образцы, для их идентификации / свойства первичного ключа, некоторые используют примитивный тип Java, некоторые используют тип оболочки;

private int id; 

против

  private Integer id; 

Почему и когда я буду использовать один над другим, для ключа сущности?

С точки зрения спящего режима это ничего не меняет, поскольку Hibernate использует тот же тип Hibernate для их представления.

Однако, как указывает Bytecode Ninja, вы не можете отличить значение по умолчанию примитивного int 0 от назначенного 0 то время как нет никакой двусмысленности с null ( null идентификатор всегда означает новый объект), поэтому Я предпочитаю использовать тип обнуляемой оболочки.

И это рекомендация Hibernate. Из справочной документации:

4.1.2. Укажите свойство идентификатора (необязательно)

У Cat есть свойство, называемое id. Это свойство сопоставляется с столбцом первичного ключа таблицы базы данных. Свойство могло быть вызвано чем угодно, и его тип мог быть любым примитивным типом, любым примитивным типом «обертка», java.lang.String или java.util.Date. Если у вашей старой таблицы базы данных есть составные ключи, вы можете использовать пользовательский class со свойствами этих типов (см. Раздел о составных идентификаторах далее в главе.)

Свойство идентификатора строго необязательно. Вы можете оставить их и позволить Hibernate отслеживать идентификаторы объектов внутри компании. Однако мы не рекомендуем это делать.

Фактически, некоторые функции доступны только для classов, объявляющих свойство идентификатора:

  • Переходная повторная привязка для отдельных объектов (обновление каскада или слияние каскадов) – см. Раздел 10.11 «Транзитивная настойчивость»,
  • Session.saveOrUpdate ()
  • Session.merge ()

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

И я действительно использую это в своем базовом classе:

 @MappedSuperclass public class BaseEntity implements Serializable { private static final long serialVersionUID = 1L; private Long id; @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Transient public boolean isNew() { return (this.id == null); } } 

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

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

Вы можете указать свой первичный ключ как примитив или обертку. И так как обычно преимущества Integer не нужны, лучше всего держать его простым с помощью int .

Дополнительная информация на oracle.com .

  • Как создать таблицу объединений с аннотациями JPA?
  • Получение соединения с базой данных в чистой настройке JPA
  • Bypass GeneratedValue в спящем режиме (данные объединить не в db?)
  • Entity Framework слишком медленная. Какие у меня варианты?
  • Hibernate Annotations - Что лучше, поле или доступ к собственности?
  • В чем разница между persist () и merge () в Hibernate?
  • Можно ли создавать модели django из базы данных?
  • JPA CascadeType.ALL не удаляет сирот
  • Бесконечная recursion с выпуском Jackson JSON и Hibernate JPA
  • Классы classов Hibernate должны быть Serializable?
  • Как обновить схемы таблиц базы данных с помощью генерации схемы NHibernate?
  • Interesting Posts

    Как использовать selenium webdriver на локальной (на моем компьютере) веб-странице вместо того, чтобы найти где-нибудь на www?

    Получить элемент по индексу в jQuery

    Увеличение максимального количества подключений Google Chrome на сервер до более чем 6

    как очистить кеш в gwt?

    Преобразование нескольких строк в один с запятой как разделитель

    Коэффициент переупорядочения дает разные результаты, в зависимости от того, какие пакеты загружены

    Регулярное выражение для слова «или» нескольких слов в grep

    В чем разница между fetch = “EAGER” и fetch = “LAZY” в доктрине

    Восстановление данных из Guttman 35 pass?

    Значение по умолчанию параметра функции

    Удаление папки с именем "con"

    Настройки прокси-сервера Internet Explorer не сохраняются

    Многострочные методы обхода комментариев?

    Отключить антиализацию при масштабировании изображений

    Копировать в каталог вывода копирует структуру папок, но только для копирования файлов

    Давайте будем гением компьютера.