混乱:@NotNull vs @Column(nullable = false)
-
当他们出现在
@Entity
的字段/ getter时,他们之间有什么区别? (我坚持实体通过hibernate )。 -
他们每个人所属的框架和/或规格是什么?
-
@NotNull
位于javax.validation.constraints
。 在javax.validation.constraints.NotNull
javadoc中说注释元素不能为空
但是它并不涉及数据库中元素的表示,所以为什么要将约束
nullable=false
添加到列?
@NotNull
是一个JSR 303的Beanvalidation注解。 它与数据库约束本身无关。 由于Hibernate是JSR 303的参考实现,它会智能地获取这些约束,并将它们转换成数据库约束,因此您可以得到两个约束。 @Column(nullable = false)
是JPA声明一个列非空的方式。 即前者用于validation,后者用于指示数据库模式细节。 您只需从Hibernate获得一些额外的(并且欢迎的)帮助。
最新版本的hibernate JPA提供程序默认使用像@NotNull
这样的beanvalidation约束(JSR 303)到DDL(感谢hibernate.validator.apply_to_ddl property
默认值为true
)。 但是,不能保证其他JPA提供者做甚至有能力做到这一点。
您应该使用像@NotNull
这样的beanvalidation注释来确保在JVM中validationjava bean时,该bean属性被设置@NotNull
null值(这与数据库约束无关,但在大多数情况下应该与它们相对应) 。
你还应该像使用@Column(nullable = false)
一样使用JPA注释来给jpa提供者提示,以便用你想要的数据库约束来生成正确的DDL来创build表列。 如果你可以或者想要依赖像Hibernate那样的JPA提供者,那么默认情况下就会将DDL的beanvalidation约束应用到DDL中,那么你可以忽略它们。