Jam*_*hon 58 java annotations hibernate jpa
在JPA中设置列的长度到底是做什么的?
@Column(name = "middle_name", nullable = false, length = 32)
public String getMiddleName() {
return this.middleName;
}
Run Code Online (Sandbox Code Playgroud)
我知道您可以使用注释来生成基于实体对象的数据库模式(DDL),但是当持久性发生时,长度是否会进行任何类型的检查或截断,还是仅用于模式创建?
我也意识到JPA可以放在各种实现之上,在这种情况下我关注的实现是Hibernate.
Pas*_*ent 81
当持久性发生时,长度是否会进行任何类型的检查或截断,还是仅用于模式创建?
列长.(仅在使用字符串值列时适用.)
并且仅用于生成的DDL.在您的示例中,生成的列将生成为a VARCHAR(32)并尝试插入更长的字符串将导致SQL错误.
对于验证,您可以从Bean Validation API(JSR 303)添加@Size(max=32) 约束.我在这里提供了一个带有可运行测试的样本.
提供这两者Size并且length可能看起来多余但是根据Bean Validation规范的附录D.,生成Bean Validation-aware DDL对于持久性提供程序不是必需的.因此,请使用lengthDDL @Size进行验证.
如果您感兴趣,只需在带有JPA 2.0的类路径上放置Bean Validation实现.使用JPA 1.0,请参阅前面的答案.
Hibernate 4.3.11(和其他版本)要注意Validation Annotations。- 所以你可能需要升级
这是Hibernate 4.3.11 手册中的引用
Hibernate Core 还提供与一些外部模块/项目的集成。这包括 Hibernate Validator Bean Validation (JSR 303) 和 Hibernate Search 的参考实现。
... Hibernate 和 Bean Validation 之间的集成在两个级别上工作。首先,它能够检查类的内存实例是否违反约束。其次,它可以将约束应用于 Hibernate 元模型并将它们合并到生成的数据库模式中。...
Hibernate 使用 Bean Validation 约束来生成准确的数据库模式:
Run Code Online (Sandbox Code Playgroud)@NotNull leads to a not null column (unless it conflicts with components or table inheritance) @Size.max leads to a varchar(max) definition for Strings @Min, @Max lead to column checks (like value <= max) @Digits leads to the definition of precision and scale (ever wondered which is which? It's easy now with @Digits :) )
注意:@Lengh 也可以工作,比如 @Size
当您使用 Hibernate Validator 5.1 时,您还需要一个 el-Implementation。例如
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
如果你没有这个,则Hibernate ORM将未能启动Hibernate的验证,广告因此不会采取(全部)JSR-303,例如@Length,@Size在帐户!