在@Column JPA annontation上设置length属性时会做些什么?

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

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

我知道你可以使用注释来生成基于实体对象的数据库模式(DDL),但是当持久化发生时长度会做任何types的检查或截断,或者它仅用于模式创build?

我也意识到,JPA可以坐在各种实现的顶部,在这种情况下我所关心的实现是Hibernate。

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

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

列长度​​。 (仅在使用string值列时适用。)

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


对于validation,您可以从BeanvalidationAPI( JSR 303 )添加@Size(max=32) 约束 。 我在这里提供了一个可运行testing的示例。

同时提供Sizelength可能看起来是多余的,但根据Bean Validation规范的附录D ,对于持久性提供者,生成Beanvalidation识别DDL不是必需的。 所以使用DDL的length来进行validation。

如果您有兴趣,只需在JPA 2.0的classpath中添加一个Bean Validation实现。 使用JPA 1.0,请参阅此前的答案 。

@column(长度= 32)仅用于DDL的目的,而不是限制意味着它允许超过32个字符,除非在表级别上不受限制。要限制大小,我们再去@size(max = 32)

Hibernate 4.3.11(和其他版本)应该注意validation注释。 – 所以你可能不得不升级

这是从Hibernate 4.3.11手册中引用的

第22章附加模块

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

第22.1章Beanvalidation

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 Validation,因此它不需要(全部)JSR-303,例如@Length@Size

顺便说一句,如果你不设置长度,它将默认为255(用MySQLtesting)