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

Posted

技术标签:

【中文标题】@OneToOne(optional=false) 和 @JoinColumn(nullable=false) 一起使用【英文标题】:@OneToOne(optional=false) and @JoinColumn(nullable=false) used together 【发布时间】:2012-01-06 16:33:57 【问题描述】:

我在 JPA 2.0 FR Specification, 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】:

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

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

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

【讨论】:

您的意思是这种行为在不使用 EAGER(例如 @OneToOne(optional = false, fetch= FetchType.EAGER))的情况下有效吗? OneToOne 关系在 JPA2 中默认是急切的。不知道你在问什么。什么行为? 好的,我在文档中读错了 JPA 的部分。所以这在 JPA2 中很好,谢谢。

以上是关于@OneToOne(optional=false) 和 @JoinColumn(nullable=false) 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

外键 jpa/hibernate 注释不能按预期工作

@Basic(optional = false) vs @Column(nullable = false) vs @NotNull

使用 optional=false 进行一对一延迟加载,但如何使用 null 保存关联的子对象

JPA 连表查询

java 8 Optional

Java8特性:Optional空值处理