在@Column JPA annontation上设置时,length属性的作用是什么?

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

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

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

列长.(仅在使用字符串值列时适用.)

并且仅用于生成的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,请参阅前面的答案.

  • 谢谢,我怀疑了.您是否碰巧有一个引文说明注释仅适用于DDL?我无法在文档中明确说明. (2认同)
  • 我尝试同时使用“@Size(max=32)”和“@Column(length=128)”,不幸的是“@Size”似乎优先。也许这是一个 Hibernate 错误。 (2认同)

小智 6

@Column(length=32)仅用于 DDL 目的,而不用于限制,意味着它允许超过 32 个字符,除非在表级别不受限制。要限制大小,我们应该采用 @Size(max=32)


Ral*_*lph 6

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 :) )
Run Code Online (Sandbox Code Playgroud)

注意:@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在帐户!