JPA中的@Basic(可选= false)vs @Column(nullable = false)

时间:2010-05-24 17:57:52

标签: java orm jpa

JPA持久性中@Basic(optional = false)@Column(nullable = false)之间的区别是什么?

2 个答案:

答案 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可以执行此操作。)