混乱:@NotNull vs @Column(nullable = false)

  1. 当他们出现在@Entity的字段/ getter时,他们之间有什么区别? (我坚持实体通过hibernate )。

  2. 他们每个人所属的框架和/或规格是什么?

  3. @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中,那么你可以忽略它们。