JPA持久性中@Basic(optional = false)
和@Column(nullable = false)
之间的区别是什么?
答案 0 :(得分:89)
Gordon Yorke(EclipseLink架构委员会成员,TopLink核心技术主管,JPA 2.0专家组成员)就此主题写了一个很好的答案,所以我引用his answer而不是解释他:
optional
和之间的差异nullable
是他们的范围 被评估。的定义 'optional
'讨论财产问题 字段值并暗示这一点 功能应该在内部进行评估 运行。 'nullable
'只在 对数据库列的引用。如果实施选择 然后实施
optional
应评估属性 持久性提供程序和内存 在发送SQL之前引发的异常 否则在使用时到数据库 'updatable=false
''optional
' 永远不会报告违规行为。
答案 1 :(得分:2)
所以我使用JPA 2.1(EclipseLink)尝试了@Basic(optional = false)注释,结果发现在实际使用中忽略了注释(至少对于String字段)。 (例如,entityManager.persist调用)。
所以我去了规范并阅读了它。
这是规范必须说的:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
Basic(可选):字段或属性的值是否可以 空值。这是一个提示,被忽略了原始类型;它可能是 用于模式生成。
所以我认为这句话解释了Basic(可选)的实际用例,它用于模式生成。 (即:从Java实体类生成CREATE TABLE SQL时。例如,Hibernate可以执行此操作。)