@ManyToOne可选标志与@JoinColumn可空标志有什么不同?

时间:2016-11-02 12:19:45

标签: jpa

我有以下内容来定义一个公司,该公司在我的实体上不能为空:

@ManyToOne(optional = false)
@JoinColumn(nullable = false)
private Company company;

' optional = false'有什么区别?关于@ManyToOne注释和' nullable = false'在@JoinColumn注释上。或者设置它们都是多余的?

1 个答案:

答案 0 :(得分:4)

@ManyToOne对所谓的逻辑模型进行操作,即对象关系映射的面向对象的一面。这里optional=false的语义是:

  

关联是否可选。如果设置为false,则必须始终存在非空关系。

因此,JPA引擎希望底层存储始终提供可以转换为Company对象的值。

@JoinColumn对物理模型进行操作,即数据存储(数据库)中的实际情况。指定nullable = false将使DB列不可为空。

如果省略@JoinColumn(nullable = false),则该列可以为空。可以在那里插入一个空值, DB 会很乐意接受它。但是,如果有人试图通过JPA读取该值,则 JPA引擎会发生抗议,因为它期望可以转换为Company对象的值始终存在,如{{ 1}}。

相关问题