it-swarm.cn

困惑:@NotNull vs @Column(nullable = false)

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

  2. 每个人都属于哪个框架和/或规范?

  3. @NotNull位于javax.validation.constraints内。在javax.validation.constraints.NotNull javadoc中它说

    带注释的元素不能为null

    但它没有提到元素在数据库中的表示,那么为什么我要将约束nullable=false添加到列中呢?

209
rapt

@NotNull 是一个 JSR 303 Bean Validation annotation。它与数据库约束本身无关。但是,由于Hibernate是JSR 303的参考实现,它会智能地了解这些约束并将它们转换为数据库约束,因此您可以以一个的价格获得两个约束。 @Column(nullable = false) 是JPA声明列不为空的方式。即前者用于验证,后者用于指示数据库架构详细信息。您只是从验证注释中获得Hibernate的一些额外(并且欢迎!)帮助。

286
Ryan Stewart

最新版本的hibernate JPA提供程序默认情况下将bean验证约束(JSR 303)(如@NotNull)应用于DDL(感谢hibernate.validator.apply_to_ddl property默认为true)。但是不能保证其他JPA提供商能够做甚至有能力做到这一点。

在验证JVM中的Java bean时,应该使用bean验证注释(如@NotNull)来确保将bean属性设置为非空值(这与数据库约束无关,但在大多数情况下应与它们相对应)。

您还应该使用像@Column(nullable = false)这样的JPA注释来为jpa提供程序提示生成正确的DDL,以便使用您想要的数据库约束创建表列。如果您可以或者想要依赖像Hibernate这样的JPA提供程序,默认情况下会将bean验证约束应用于DDL,那么您可以省略它们。

12
Sebastian Theek

有趣的是,所有消息来源都强调@Column(nullable = false)仅用于DDL生成。

但是,即使没有@NotNull注释,并且hibernate.check_nullability选项设置为true,Hibernate也会执行要保留的实体的验证。

如果nullable = false属性没有值,它将抛出PropertyValueException,说“not-null属性引用null或transient值”,即使数据库层中没有实现这样的限制。

有关hibernate.check_nullability选项的更多信息,请访问: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping

8
Aleksandar Radulović