[英]What happens if the length attribute is not specified on the @Column annontation for a String
[英]What does the length attribute do when set on the @Column JPA annontation?
在 JPA 中设置列的长度到底有什么作用?
@Column(name = "middle_name", nullable = false, length = 32)
public String getMiddleName() {
return this.middleName;
}
我知道您可以使用注释根据实体对象生成数据库模式 (DDL),但是当持久性发生时,长度是否会进行任何类型的检查或截断,或者它仅用于模式创建?
我还意识到 JPA 可以位于各种实现之上,在这种情况下我关心的实现是 Hibernate。
当持久性发生时,长度是否进行任何类型的检查或截断,或者它仅用于模式创建?
列长度。 (仅在使用字符串值列时适用。)
并且仅在生成的 DDL 中使用。 在您的示例中,结果列将生成为VARCHAR(32)
并且尝试插入更长的字符串将导致 SQL 错误。
对于验证,您可以从 Bean 验证 API ( JSR 303 ) 添加@Size(max=32)
约束。 我在这里提供了一个带有可运行测试的示例。
提供Size
和length
似乎是多余的,但根据 Bean 验证规范的附录 D ,生成 Bean 验证感知 DDL 对于持久性提供程序不是强制性的。 所以 DDL 使用length
, @Size
进行验证。
如果您有兴趣,只需在 JPA 2.0 的类路径上放置一个 Bean 验证实现。 对于 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 约束来生成准确的数据库模式:
@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
!
@Column(length=32)
仅用于 DDL 目的而不是用于限制意味着它允许超过 32 个字符,除非在表级别它不受限制。要限制大小,我们应该使用@Size(max=32)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.