1.当它们出现在@Entity的字段/getter上时,它们之间有什么区别?(我通过Hibernate持久化实体)。1.它们各自属于什么框架和/或规范?
@Entity
@NotNull
javax.validation.constraints
javax.validation.constraints.NotNull
nullable=false
umuewwlo1#
@NotNull是一个JSR 303 Bean Validation注解。它与数据库约束本身无关。然而,由于Hibernate是JSR 303的参考实现,它智能地选择这些约束并将其转换为数据库约束,因此您可以得到一个价格的两个约束。@Column(nullable = false)是JPA声明列为非空的方式。也就是说,前者用于验证,后者用于指示数据库模式细节。你只是得到一些额外的(欢迎!)帮助从Hibernate上的验证注解。
@Column(nullable = false)
kknvjkwl2#
最新版本的hibernateJPA提供程序默认将bean验证约束(JSR 303)应用于@NotNull(由于hibernate.validator.apply_to_ddl property默认为true)。但是不能保证其他JPA提供者能够做到这一点,甚至不能保证他们有能力做到这一点。在JVM中验证java bean时,应该使用bean验证注解(如@NotNull)来确保bean属性设置为非空值(这与数据库约束无关,但在大多数情况下应该与它们相对应)。您还应该使用像@Column(nullable = false)这样的JPA注解来给予jpa提供者提示,以生成正确的索引,从而使用您想要的数据库约束创建表列。如果您可以或希望依赖像Hibernate这样的JPA提供者,它默认将bean验证约束应用于Hibernate,那么您可以省略它们。
hibernate.validator.apply_to_ddl property
true
mftmpeh83#
@Column
@Column注解的nullable属性有两个用途:
nullable
在生成CREATE TABLE语句时,HBM2DB2模式生成工具将@Column(nullable = false)实体属性转换为相关表列的NOT NULL约束。正如我在Hibernate用户指南中所解释的,最好使用像Flyway这样的工具来生成数据库模式,而不是依赖于HBM2f1x机制。
CREATE TABLE
NOT NULL
当刷新持久化上下文时,Hibernate ORM还使用@Column(nullable = false)实体属性:
new Nullability( session ).checkNullability( values, persister, true );
如果验证失败,Hibernate将抛出一个PropertyValueException,并阻止执行所需的UPDATE或UPDATE语句:
PropertyValueException
if ( !nullability[i] && value == null ) { //check basic level one nullablilty throw new PropertyValueException( "not-null property references a null or transient value", persister.getEntityName(), persister.getPropertyNames()[i] ); }
@NotNull注解由Bean Validation定义,就像Hibernate ORM是最流行的JPA实现一样,最流行的Bean Validation实现是Hibernate Validator框架。当使用Hibernate Validator沿着Hibernate ORM时,Hibernate Validator在验证实体时将抛出ConstraintViolation。
ConstraintViolation
p1iqtdky4#
值得注意的是,所有的来源都强调@Column(nullable=false)只用于数据库生成。但是,即使没有@ Nothing注解,并且hibernate.check_nullability选项设置为true,Hibernate也会对要持久化的实体执行验证。如果nullable=false属性没有值,它将抛出PropertyValueException,说“not-null property references a null or transient value”,即使数据库层没有实现这样的限制。有关hibernate.check_nullability选项的更多信息,请访问:http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping。
yrdbyhpb5#
| @NotNull| @Column(nullable=false)|| --|--|| 通常用于检查Java对象的字段的非空性|通常仅用于生成空字段(可以在java对象的字段中创建空字段,但不能将其持久化到db列)|| Bean验证规范的一部分,如hibernate-validator| JPA规范的一部分|| Hibernate足够聪明,能够理解如果@NotNull被用来阻止java对象字段上的空字段,这意味着数据库中相应的列也不应该有空值。因此,* 当使用Hibernate* 时,这提供了字段和数据库级别的非空性| * 当使用hibernate* 时,沿着db列级非空性验证,它还提供java对象字段级验证,仅当spring.jpa.properties.hibernate.check_nullability=true|TL;DR**建议:**使用@NotNull,因为数据库脚本通常不是由hibernate创建的。
hibernate-validator
spring.jpa.properties.hibernate.check_nullability=true
5条答案
按热度按时间umuewwlo1#
@NotNull
是一个JSR 303 Bean Validation注解。它与数据库约束本身无关。然而,由于Hibernate是JSR 303的参考实现,它智能地选择这些约束并将其转换为数据库约束,因此您可以得到一个价格的两个约束。@Column(nullable = false)
是JPA声明列为非空的方式。也就是说,前者用于验证,后者用于指示数据库模式细节。你只是得到一些额外的(欢迎!)帮助从Hibernate上的验证注解。kknvjkwl2#
最新版本的hibernateJPA提供程序默认将bean验证约束(JSR 303)应用于
@NotNull
(由于hibernate.validator.apply_to_ddl property
默认为true
)。但是不能保证其他JPA提供者能够做到这一点,甚至不能保证他们有能力做到这一点。在JVM中验证java bean时,应该使用bean验证注解(如
@NotNull
)来确保bean属性设置为非空值(这与数据库约束无关,但在大多数情况下应该与它们相对应)。您还应该使用像
@Column(nullable = false)
这样的JPA注解来给予jpa提供者提示,以生成正确的索引,从而使用您想要的数据库约束创建表列。如果您可以或希望依赖像Hibernate这样的JPA提供者,它默认将bean验证约束应用于Hibernate,那么您可以省略它们。mftmpeh83#
JPA
@Column
Annotation@Column
注解的nullable
属性有两个用途:Schema生成工具
在生成
CREATE TABLE
语句时,HBM2DB2模式生成工具将@Column(nullable = false)
实体属性转换为相关表列的NOT NULL
约束。正如我在Hibernate用户指南中所解释的,最好使用像Flyway这样的工具来生成数据库模式,而不是依赖于HBM2f1x机制。
持久化上下文刷新
当刷新持久化上下文时,Hibernate ORM还使用
@Column(nullable = false)
实体属性:如果验证失败,Hibernate将抛出一个
PropertyValueException
,并阻止执行所需的UPDATE或UPDATE语句:Bean验证
@NotNull
标注@NotNull
注解由Bean Validation定义,就像Hibernate ORM是最流行的JPA实现一样,最流行的Bean Validation实现是Hibernate Validator框架。当使用Hibernate Validator沿着Hibernate ORM时,Hibernate Validator在验证实体时将抛出
ConstraintViolation
。p1iqtdky4#
值得注意的是,所有的来源都强调@Column(nullable=false)只用于数据库生成。
但是,即使没有@ Nothing注解,并且hibernate.check_nullability选项设置为true,Hibernate也会对要持久化的实体执行验证。
如果nullable=false属性没有值,它将抛出PropertyValueException,说“not-null property references a null or transient value”,即使数据库层没有实现这样的限制。
有关hibernate.check_nullability选项的更多信息,请访问:http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping。
yrdbyhpb5#
| @NotNull| @Column(nullable=false)|
| --|--|
| 通常用于检查Java对象的字段的非空性|通常仅用于生成空字段(可以在java对象的字段中创建空字段,但不能将其持久化到db列)|
| Bean验证规范的一部分,如
hibernate-validator
| JPA规范的一部分|| Hibernate足够聪明,能够理解如果
@NotNull
被用来阻止java对象字段上的空字段,这意味着数据库中相应的列也不应该有空值。因此,* 当使用Hibernate* 时,这提供了字段和数据库级别的非空性| * 当使用hibernate* 时,沿着db列级非空性验证,它还提供java对象字段级验证,仅当spring.jpa.properties.hibernate.check_nullability=true
|TL;DR**建议:**使用
@NotNull
,因为数据库脚本通常不是由hibernate创建的。