@OneToOne(可选= false)和@JoinColumn(nullable = false)一起使用

时间:2011-11-25 23:38:38

标签: java annotations jpa-2.0 java-ee-6 nullable

我在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 个答案:

答案 0 :(得分:31)

正式optional=false是JPA实现的运行时指令,nullable=false是DDL生成器的指令。所以它们并不是严格多余的。

当涉及实体继承时,差异可能会变得很大。如果特定映射仅存在于子类上,并且您具有单个表表每层次结构策略,则OneToOne映射可能在包含映射的特定子类上为optional=false。但是,实际的连接列不能为空 - 因为那时共享表的其他子类不能插入!

在实践中,不同提供商的不同版本可能会或可能不会在任何时候解释任何一个,但需要注意。