混淆:@NotNull与@Column(nullable = false)与JPA和Hibernate

  1. 当它们出现在一个字段/getter 上时,它们之间有什么区别?(我通过休眠来持久化实体)。@Entity

  2. 它们分别属于哪个框架和/或规范?

  3. @NotNull位于 .在javadoc中,它说javax.validation.constraintsjavax.validation.constraints.NotNull

    带批注的元素不得为空

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


答案 1

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


答案 2

最新版本的休眠 JPA 提供程序默认将 Bean 验证约束 (JSR 303) 应用于 DDL(由于默认为 )。但是不能保证其他JPA提供者确实有能力做到这一点。@NotNullhibernate.validator.apply_to_ddl propertytrue

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

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


推荐