258
  1. 当它们出现在 a 的字段/吸气剂上时@Entity,它们之间有什么区别?(我通过Hibernate持久化实体)。

  2. 它们各自属于什么框架和/或规范?

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

    带注释的元素不能为空

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

4

4 回答 4

340

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

于 2011-09-16T02:28:57.647 回答
20

最新版本的休眠 JPA 提供程序默认将 bean 验证约束 (JSR 303)@NotNull应用于 DDL(感谢hibernate.validator.apply_to_ddl property默认设置true)。但是不能保证其他 JPA 提供者会这样做,甚至有能力这样做。

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

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

于 2017-02-26T22:09:05.977 回答
16

JPA@Column注释

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

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

模式生成工具

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

正如我在Hibernate User Guide中解释的那样,最好使用 Flyway 之类的工具,不是依赖 HBM2DDL 机制来生成数据库模式。

持久性上下文刷新

在刷新 Persistence Context 时,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]
        );    
}

Bean 验证@NotNull注解

注解由 Bean Validation 定义,@NotNull就像 Hibernate ORM 是最流行的 JPA 实现一样,最流行的 Bean Validation 实现是Hibernate Validator框架。

当 Hibernate Validator 与 Hibernate ORM 一起使用时,Hibernate ValidatorConstraintViolation在验证实体时会抛出一个错误。

于 2020-02-29T19:42:51.740 回答
13

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

然而,即使没有 @NotNull 注解,并且 hibernate.check_nullability 选项设置为 true,Hibernate 也会对要持久化的实体进行验证。

如果 nullable=false 属性没有值,它将抛出 PropertyValueException 说“非空属性引用空值或瞬态值”,即使在数据库层中没有实现此类限制。

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

于 2018-02-21T11:42:13.723 回答