@OneToOne(optional=false) и @JoinColumn (nullable = false), используемые вместе

Я столкнулся с этим примером в спецификации JPA 2.0 FR, 11.1.37. OneToOne Annotation, стр. 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

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

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

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