在@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的示例。
同时提供Size
和length
可能看起来是多余的,但根据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)