困惑:@ Nothing vs.@Column(nullable = false)与JPA和Hibernate

wbrvyc0a  于 2023-10-19  发布在  其他
关注(0)|答案(5)|浏览(136)

1.当它们出现在@Entity的字段/getter上时,它们之间有什么区别?(我通过Hibernate持久化实体)。
1.它们各自属于什么框架和/或规范?

  1. @NotNull位于javax.validation.constraints内。在javax.validation.constraints.NotNull javadoc中,
    带注解的元素不能为空
    但是它并没有说明元素在数据库中的表示,那么我为什么要向列添加约束nullable=false呢?
umuewwlo

umuewwlo1#

@NotNull是一个JSR 303 Bean Validation注解。它与数据库约束本身无关。然而,由于Hibernate是JSR 303的参考实现,它智能地选择这些约束并将其转换为数据库约束,因此您可以得到一个价格的两个约束。@Column(nullable = false)是JPA声明列为非空的方式。也就是说,前者用于验证,后者用于指示数据库模式细节。你只是得到一些额外的(欢迎!)帮助从Hibernate上的验证注解。

kknvjkwl

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,那么您可以省略它们。

mftmpeh8

mftmpeh83#

JPA @Column Annotation

@Column注解的nullable属性有两个用途:

  • 它被模式生成工具使用
  • 它由Hibernate在刷新持久性上下文时使用

Schema生成工具

在生成CREATE TABLE语句时,HBM2DB2模式生成工具将@Column(nullable = false)实体属性转换为相关表列的NOT NULL约束。
正如我在Hibernate用户指南中所解释的,最好使用像Flyway这样的工具来生成数据库模式,而不是依赖于HBM2f1x机制。

持久化上下文刷新

当刷新持久化上下文时,Hibernate ORM还使用@Column(nullable = false)实体属性:

new Nullability( session ).checkNullability( values, persister, true );

如果验证失败,Hibernate将抛出一个PropertyValueException,并阻止执行所需的UPDATE或UPDATE语句:

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]
        );    
}

Bean验证@NotNull标注

@NotNull注解由Bean Validation定义,就像Hibernate ORM是最流行的JPA实现一样,最流行的Bean Validation实现是Hibernate Validator框架。
当使用Hibernate Validator沿着Hibernate ORM时,Hibernate Validator在验证实体时将抛出ConstraintViolation

p1iqtdky

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。

yrdbyhpb

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创建的。

相关问题