Ответ 1
С точки зрения спящего режима это ничего не меняет, поскольку Hibernate использует тот же тип Hibernate для их представления.
Однако, как указывает Bytecode Ninja, вы не можете отличить значение по умолчанию примитива int 0
от назначенного 0
, в то время как нет возможной двусмысленности с null
(a null
id всегда означает новый объект), поэтому я предпочитаю использовать тип обнуляемой оболочки.
И это рекомендация Hibernate. Из справочной документации:
4.1.2. Укажите свойство идентификатора (необязательно)
У Cat есть свойство, называемое id. Эта карты свойств к первичному ключу столбец таблицы базы данных. свойство можно было бы назвать ничего, и его тип мог быть любой примитивный тип, любой примитив тип "обертка", java.lang.String или java.util.Date. Если ваше наследие таблица базы данных имеет составные клавиши, вы может использовать пользовательский класс с свойства этих типов (см. раздел о составных идентификаторах позже в главе.)
Свойство идентификатора строго необязательный. Вы можете оставить их и пусть Hibernate отслеживает объект идентификаторы внутри. Мы не рекомендую это, однако.
На самом деле, некоторые функции доступны только классам, объявляющим свойство идентификатора:
- Переходная повторная привязка для отдельных объектов (каскадное обновление или каскад слияние) - см. раздел 10.11, "Транзитивная настойчивость"
- Session.saveOrUpdate()
- Session.merge()
Мы рекомендуем, что вы заявляете Идентификатор последовательно свойства на постоянных классах и , что вы используете значение NULL (т. не-примитивный).
И я действительно использую это в своем базовом классе:
@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);
}
}