我正在从Hibernate实体生成DDL。一些实体正在使用JSR 303验证器注释(javax.validation.constraints)。Max -是其中之一)。
DDL是使用Hibernate Tools 4.0.0 CR1 +相关Ant Task生成的。
问题是所有的文本列(即使它们可能受到@Max(32)的限制)都被生成为VARCHAR(255)。我已经尝试调试org.hibernate.tool.hbm2ddl。SchemaExport类(以及相关的)。从我所看到的,在org.hibernate.cfg的构建过程中没有地方。Ejb3Column,它将包含与Validator注释相关的任何逻辑。
我也试图修改'hibernate.validator。Apply_to_ddl’属性-没有任何成功。
如有任何提示,不胜感激。
组件/库:
- JDK 6 Hibernate验证器4.3.0 FinalHibernate Commons Annotations 4.0.2 Final Hibernate Core 4.2.2 Final
- Hibernate实体管理器4.2.2 Final
hbm2ddl
不考虑JSR 303注释。从工具的角度来看,这是有道理的。它为数据库生成"代码"(DDL),而JSR 303又名bean验证在JVM中操作。
要在数据库中固定大小,需要设置JPA @Column
注释的length
属性。是的,你需要复制大小约束,这很难看,但这就是它的方式。
hbm2ddl
考虑了一些Bean验证约束,即@NotNull
, @Size
, @Digits
和Hibernate Validator定义的遗留@Length
约束。
如果没有看到Hibernate ORM发出的DDL中反映的约束,原因可能是:
- 在类路径上没有Bean验证提供程序(如Hibernate验证器);仅仅Bean Validation API JAR是不够的,因为Hibernate ORM引导了一个实际的验证工厂来获取约束元数据
- 您没有使用验证模式
AUTO
或DDL
。只有在这些模式下,约束才会传播到DDL 。