С точки зрения Hibernate это ничего не меняет, так как Hibernate использует тот же тип Hibernate для их представления.
Однако, как указывает Bytecode Ninja, вы не можете различить значение по умолчаниюпримитива int 0
из присваиваемого 0
, в то время как нет никакой возможной двусмысленности с null
(идентификатор null
всегда означает новую сущность), поэтому я предпочитаю использовать тип обнуляемой оболочки.
И это рекомендация Hibernate.Из справочной документации:
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);
}
}