Answers:
@NotNull
是JSR 303 Bean验证批注。它与数据库约束本身无关。由于Hibernate是JSR 303的参考实现,因此它会智能地选择这些约束并将它们转换为数据库约束,因此您只需花1英镑即可获得2个。@Column(nullable = false)
是JPA声明列为非空的方式。即,前者用于验证,而后者则用于指示数据库架构详细信息。您将从Hibernate的验证批注中获得一些额外的(欢迎使用!)帮助。
@NotNull
,@Size
,@Min
,@Max
,等,并翻译成那些数据库约束。
休眠的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。
@Column
批注注释的nullable
属性@Column
有两个用途:
当生成语句时,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刷新机制如何工作的更多详细信息,请参阅本文。
@NotNull
注释该@NotNull
注释是由Bean验证和定义,就像Hibernate的ORM是最流行的JPA实现,最流行的Bean验证实现的 Hibernate的验证框架。
与Hibernate ORM一起使用Hibernate Validator时,Hibernate Validator将ConstraintViolation
在验证实体时抛出。