Примитив или оболочка для спящих первичных ключей - PullRequest
36 голосов
/ 21 августа 2010

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

 private Integer id;

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

Ответы [ 3 ]

33 голосов
/ 21 августа 2010

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

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

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

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

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

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

На самом деле, некоторые функции доступны только для классов, которые объявляют свойство идентификатора:

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

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

И я фактически использую это в своем базовом классе:

@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);
    }
}
9 голосов
/ 21 августа 2010

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

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

1 голос
/ 21 августа 2010

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

Подробнее на oracle.com .

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