@OneToOne (необязательно = false) и @JoinColumn (nullable = false) используются вместе - PullRequest
16 голосов
/ 26 ноября 2011

Я столкнулся с этим примером в спецификации JPA 2.0 FR, 11.1.37. OneToOne Аннотация, стр. 403:

@OneToOne(optional=false)
@JoinColumn(name="CUSTREC_ID", unique=true, nullable=false, updatable=false)
public CustomerRecord getCustomerRecord() { return customerRecord; }

Есть ли причина, по которой я должен поставить @OneToOne(optional=false) и в то же время поставить @JoinColumn(... nullable=false)?

Разве эти два объявления не одинаковы? Разве один из них не избыточен?
Они оба используются в генерации схемы DDL?

1 Ответ

32 голосов
/ 26 ноября 2011

Формально optional=false - это инструкция времени выполнения для реализации JPA, а nullable=false - это инструкция для генератора DDL.Таким образом, они не являются строго избыточными.

Различие может стать значительным, когда задействовано наследование объекта.Если конкретное сопоставление существует только в подклассе, и у вас есть стратегия для одной таблицы для каждой иерархии, тогда сопоставление OneToOne может составлять optional=false для конкретного подкласса, который содержит сопоставление.Однако фактический столбец соединения нельзя сделать ненулевым, поскольку тогда другие подклассы, которые совместно используют таблицу, не могут быть вставлены!

На практике разные версии разных провайдеров могут интерпретировать или не интерпретировать ни одну из нихвремя, будьте бдительны.

...