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

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

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

 private int id; 

против

 private Integer id;

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

4b9b3361

Ответ 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);
    }
}

Ответ 2

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

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

Ответ 3

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

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