困惑:使用JPA和Hibernate的@NotNull与@Column(nullable = false)

2020/11/03 04:34 · 未分类 ·  · 0评论
  1. 当它们出现在的字段/获取器上时,它们@Entity之间有什么区别?(我通过Hibernate保留了Entity )。

  2. 它们每个都属于什么框架和/或规范?

  3. @NotNull位于中javax.validation.constraintsjavax.validation.constraints.NotNulljavadoc中说

    带注释的元素不能为空

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

@NotNullJSR 303 Bean验证批注。它与数据库约束本身无关。由于Hibernate是JSR 303的参考实现,因此它会智能地选择这些约束并将它们转换为数据库约束,因此您只需花1英镑即可获得2个。@Column(nullable = false)是JPA声明列为非空的方法。即,前者用于验证,而后者则用于指示数据库架构详细信息。您将从Hibernate的验证批注中获得一些额外的(欢迎使用!)帮助。

休眠的JPA提供程序的最新版本@NotNull默认将Bean验证约束(JSR 303)应用于DDL(由于hibernate.validator.apply_to_ddl property默认为true)。但是,不能保证其他JPA提供程序也可以做到这一点。

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

您还应该使用JPA批注,例如@Column(nullable = false)给jpa提供者提示以生成正确的DDL,以创建具有所需数据库约束的表列。如果您可以或想要依靠像Hibernate这样的JPA提供程序,该提供程序默认将Bean验证约束应用于DDL,则可以忽略它们。

有趣的是,所有资料都强调@Column(nullable = false)仅用于DDL生成。

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

如果nullable = false属性没有值,即使没有在数据库层中实现这种限制,也会抛出PropertyValueException,指出“非null属性引用了null或瞬态值”。

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

JPA@Column批注

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

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

模式生成工具

HBM2DDL模式生成工具在生成语句@Column(nullable = false)实体属性转换NOT NULL为关联表列约束CREATE TABLE

正如我在解释中Hibernate的用户指南,它更好地使用工具,如迁飞,而不是依靠就是hbm2ddl机制生成的数据库架构。

持久性上下文刷新

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

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

如果验证失败,则Hibernate将抛出PropertyValueException,并防止需要执行INSERT或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]
        );    
}

有关Hibernate刷新机制如何工作的更多详细信息,请参阅本文

Bean验证@NotNull注释

@NotNull注释是由Bean验证和定义,就像Hibernate的ORM是最流行的JPA实现,最流行的Bean验证实现的Hibernate的验证框架。

与Hibernate ORM一起使用Hibernate Validator时,Hibernate Validator将ConstraintViolation在验证实体时抛出

本文地址:http://java.askforanswer.com/kunhuoshiyongjpahehibernatedenotnullyucolumnnullable-false.html
文章标签:
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

评论已关闭!