繁体   English   中英

在 @Column JPA 注释上设置时,长度属性有什么作用?

[英]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。

当持久性发生时,长度是否进行任何类型的检查或截断,或者它仅用于模式创建?

Column注解的length属性用于指定:

列长度​​。 (仅在使用字符串值列时适用。)

并且仅在生成的 DDL 中使用。 在您的示例中,结果列将生成为VARCHAR(32)并且尝试插入更长的字符串将导致 SQL 错误。


对于验证,您可以从 Bean 验证 API ( JSR 303 ) 添加@Size(max=32) 约束 在这里提供了一个带有可运行测试的示例。

提供Sizelength似乎是多余的,但根据 Bean 验证规范的附录 D ,生成 Bean 验证感知 DDL 对于持久性提供程序不是强制性的。 所以 DDL 使用length@Size进行验证。

如果您有兴趣,只需在 JPA 2.0 的类路径上放置一个 Bean 验证实现。 对于 JPA 1.0,请参阅此先前的答案

Hibernate 4.3.11(和其他版本)要注意Validation Annotations。 - 所以你可能需要升级

这是Hibernate 4.3.11 手册中的引用

第 22 章附加模块

Hibernate Core 还提供与一些外部模块/项目的集成。 这包括 Hibernate Validator Bean Validation (JSR 303) 和 Hibernate Search 的参考实现。

第 22.1 章 Bean 验证

... Hibernate 和 Bean Validation 之间的集成在两个级别上工作。 首先,它能够检查类的内存实例是否违反约束。 其次,它可以将约束应用于 Hibernate 元模型并将它们合并到生成的数据库模式中。 ...

第 22.1.4 章数据库模式

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM