在JPA中设置列的长度到底是做什么的?
@Column(name = "middle_name", nullable = false, length = 32)
public String getMiddleName() {
return this.middleName;
}
据我所知,您可以使用注释来生成基于实体对象的数据库模式(DDL),但是当持久性发生时,长度是否会进行任何类型的检查或截断,还是仅用于模式创建?
我也意识到JPA可以放在各种实现之上,在这种情况下我关注的实现是Hibernate。
答案 0 :(得分:79)
当持久性发生时,长度是否会进行任何类型的检查或截断,还是仅用于模式创建?
列长。 (仅在使用字符串值列时适用。)
仅用于生成的DDL。在您的示例中,生成的列将生成为VARCHAR(32)
,并且尝试插入更长的字符串将导致SQL错误。
要进行验证,您可以从Bean Validation API(constraint)添加@Size(max=32)
JSR 303。我提供了一个带有可运行测试的样本here。
提供Size
和length
似乎都是多余的,但根据Bean Validation规范的Appendix D.,生成Bean Validation-aware DDL对于持久性提供程序不是必需的。因此,请使用length
作为DDL,@Size
进行验证。
如果您感兴趣,只需使用JPA 2.0在类路径上放置Bean Validation实现。使用JPA 1.0时,请参阅此previous answer。
答案 1 :(得分:4)
顺便说一句,如果你没有设置长度,默认情况下会是255(用MySQL测试)
答案 2 :(得分:3)
@column(length = 32)仅用于DDL目的而不是用于限制意味着它允许超过32个字符,除非在表级别它不受限制。为了限制大小我们称之为 @size(最大值= 32)
答案 3 :(得分:3)
Hibernate 4.3.11(和其他版本)应该注意验证注释。 - 所以你可能需要升级
的引用Hibernate Core还提供与某些外部设备的集成 模块/项目。这包括Hibernate Validator的参考 Bean验证(JSR 303)和Hibernate Search的实现。
... Hibernate和Bean Validation之间的集成工作在两个方面 水平。首先,它能够检查类的内存实例 约束违规。其次,它可以将约束应用于 Hibernate元模型并将它们合并到生成的数据库中 架构。 ...
Chapter 22.1.4 Database schema
Hibernate使用Bean Validation约束来生成准确的数据库模式:
@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>
如果你没有这个,那么Hibernate ORM将无法启动Hibernate验证,因此它不会(例如)所有JSR-303(例如@Length
,@Size
占用!