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

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

(EclipseLink架构委员会成员,TopLink核心技术负责人,JPA 2.0专家组成员)在这个主题上写了一个很好的答案,所以我不会引用他的解释,而是引用他的回答 :

optionalnullable的区别在于它们被评估的范围。 “ optional ”的定义谈到属性和字段值,并build议应在运行时间内评估此function。 ' nullable '只是参考数据库列。

如果一个实现select实现optional那么这些属性应该在持久化提供程序的内存中进行评估,并且在将SQL发送到数据库之前引发exception,否则当使用“ updatable=false ”时,将不会报告“ optional ”违规。

所以我尝试了使用JPA 2.1(EclipseLink)@Basic(可选= false)注释,事实certificate注释在实际使用中被忽略(至less对于string字段)。 (例如entityManager.persist调用)。

所以我去了规范,并阅读了它。 这是规范要说的:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/

基本(可选):字段或属性的值是否为空。 这是一种暗示,对原始types不予考虑; 它可能用于模式生成。

所以我认为这个句子解释了用于模式生成的Basic(可选)的实际用例。 (也就是说,当你从Java Entity类生成CREATE TABLE SQL时,这是Hibernate能做的事情)。