当它们出现在@Entity的字段/getter上时,它们之间有什么区别?(我通过Hibernate持久化实体)。 它们各自属于什么框架和/或规范? @NotNull位于javax.validation.constraints中。在javax。validation。constraints. notnull javadoc中 带注释的元素不能为空 但它并没有谈到元素在数据库中的表示,所以为什么我要添加约束nullable=false列?
@NotNull is a JSR 303 Bean Validation annotation. It has nothing to do with database constraints itself. As Hibernate is the reference implementation of JSR 303, however, it intelligently picks up on these constraints and translates them into database constraints for you, so you get two for the price of one. @Column(nullable = false) is the JPA way of declaring a column to be not-null. I.e. the former is intended for validation and the latter for indicating database schema details. You're just getting some extra (and welcome!) help from Hibernate on the validation annotations.
hibernate JPA提供程序的最新版本默认情况下将@ nottnull之类的bean验证约束(JSR 303)应用到DDL(多亏了hibernate.validator)。Apply_to_ddl属性默认为true)。但是,并不能保证其他JPA提供者会这样做,甚至有能力这样做。
在JVM中验证java bean时,您应该使用@ notull这样的bean验证注释来确保bean属性被设置为一个非空值(这与数据库约束无关,但在大多数情况下应该对应于数据库约束)。
您还应该使用像@Column(nullable = false)这样的JPA注释来给JPA提供程序提示,以生成正确的DDL,用于使用所需的数据库约束创建表列。如果您能够或希望依赖于像Hibernate这样的JPA提供者,它在默认情况下将bean验证约束应用到DDL,那么您可以省略它们。
有趣的是,所有来源都强调@Column(nullable=false)仅用于DDL生成。
但是,即使没有@NotNull注释,也会休眠。check_nullability选项设置为true时,Hibernate将对要持久化的实体执行验证。
如果nullable=false属性没有值,即使在数据库层没有实现这样的限制,它也会抛出PropertyValueException,表示“not-null属性引用了一个空值或瞬态值”。
更多关于hibernate的信息。check_nullability选项可在这里:http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping。
JPA @列注释
@Column注释的可空属性有两个用途:
模式生成工具使用它 Hibernate在刷新持久性上下文期间使用它
架构生成工具
在生成CREATE table语句时,HBM2DDL模式生成工具将@Column(nullable = false)实体属性转换为关联表列的NOT NULL约束。
正如我在Hibernate用户指南中所解释的,最好使用像Flyway这样的工具,而不是依赖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]
);
}
Bean验证@NotNull注释
@ nottnull注释是由Bean验证定义的,就像Hibernate ORM是最流行的JPA实现一样,最流行的Bean验证实现是Hibernate Validator框架。
当Hibernate Validator与Hibernate ORM一起使用时,Hibernate Validator在验证实体时会抛出一个ConstraintViolation。
推荐文章
- 到底是什么导致了堆栈溢出错误?
- 为什么Android工作室说“等待调试器”如果我不调试?
- Java:路径vs文件
- ExecutorService,如何等待所有任务完成
- Maven依赖Servlet 3.0 API?
- 如何在IntelliJ IDEA中添加目录到应用程序运行概要文件中的类路径?
- getter和setter是糟糕的设计吗?相互矛盾的建议
- Android room persistent: AppDatabase_Impl不存在
- Java的String[]在Kotlin中等价于什么?
- Intellij IDEA上的System.out.println()快捷方式
- 使用Spring RestTemplate获取JSON对象列表
- Spring JPA选择特定的列
- URLEncoder不能翻译空格字符
- Java中的super()
- 如何转换JSON字符串映射<字符串,字符串>与杰克逊JSON