我在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模式生成中使用的吗?
答案 0 :(得分:31)
正式optional=false
是JPA实现的运行时指令,nullable=false
是DDL生成器的指令。所以它们并不是严格多余的。
当涉及实体继承时,差异可能会变得很大。如果特定映射仅存在于子类上,并且您具有单个表表每层次结构策略,则OneToOne映射可能在包含映射的特定子类上为optional=false
。但是,实际的连接列不能为空 - 因为那时共享表的其他子类不能插入!
在实践中,不同提供商的不同版本可能会或可能不会在任何时候解释任何一个,但需要注意。