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

时间:2010-05-20 15:18:23

标签: java hibernate jpa annotations

在JPA中设置列的长度到底是做什么的?

@Column(name = "middle_name", nullable = false, length = 32)
public String getMiddleName() {
    return this.middleName;
}

据我所知,您可以使用注释来生成基于实体对象的数据库模式(DDL),但是当持久性发生时,长度是否会进行任何类型的检查或截断,还是仅用于模式创建?

我也意识到JPA可以放在各种实现之上,在这种情况下我关注的实现是Hibernate。

4 个答案:

答案 0 :(得分:79)

  

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

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

  

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

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


要进行验证,您可以从Bean Validation API(constraint)添加@Size(max=32) JSR 303。我提供了一个带有可运行测试的样本here

提供Sizelength似乎都是多余的,但根据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 4.3.11 manual

的引用

Chapter 22.Additional modules

  

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

Chapter 22.1 Bean Validation

  

...   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占用!