我有以下内容来定义一个公司,该公司在我的实体上不能为空:
@ManyToOne(optional = false)
@JoinColumn(nullable = false)
private Company company;
' optional = false'有什么区别?关于@ManyToOne注释和' nullable = false'在@JoinColumn注释上。或者设置它们都是多余的?
答案 0 :(得分:4)
@ManyToOne
对所谓的逻辑模型进行操作,即对象关系映射的面向对象的一面。这里optional=false
的语义是:
关联是否可选。如果设置为false,则必须始终存在非空关系。
因此,JPA引擎希望底层存储始终提供可以转换为Company
对象的值。
@JoinColumn
对物理模型进行操作,即数据存储(数据库)中的实际情况。指定nullable = false
将使DB列不可为空。
如果省略@JoinColumn(nullable = false)
,则该列可以为空。可以在那里插入一个空值, DB 会很乐意接受它。但是,如果有人试图通过JPA读取该值,则 JPA引擎会发生抗议,因为它期望可以转换为Company
对象的值始终存在,如{{ 1}}。