当它们出现在@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。
推荐文章
- 如何找到Java堆大小和内存使用(Linux)?
- Spring引导——不是托管类型
- 使用Enum实现单例(Java)
- RabbitMQ与通道和连接之间的关系
- buildSessionFactory()配置方法在Hibernate中已弃用?
- Spring MVC -如何获得所有的请求参数在一个地图在Spring控制器?
- 如何在Java中按两个字段排序?
- 文件之间的差异。路径中的分隔符和斜杠
- 在方法参数中使用NotNull注释
- Spring MVC中处理可选参数的@RequestParam
- Tomcat:如何查找正在运行的Tomcat版本?
- “java”、“javaw”和“javaws”之间有什么区别?
- 将Date对象转换为日历对象
- 在Java中保存最后N个元素的大小有限的队列
- 如何运行一个类从Jar不是主类在其清单文件