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

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

 private int id; 

vs

 private Integer id;

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

36
задан Pascal Thivent 21 August 2010 в 12:04
поделиться

3 ответа

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

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

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

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

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

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

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

  • Транзитивное повторное присоединение для отсоединенных объектов (каскадное обновление или каскадное merge) - см. Раздел 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);
    }
}
34
ответ дан 27 November 2019 в 06:09
поделиться

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

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

10
ответ дан 27 November 2019 в 06:09
поделиться

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

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

1
ответ дан 27 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: