基于JSR 303 Validator注释从实体生成DDL

时间:2013-05-27 11:58:49

标签: hibernate ant

我正在从Hibernate实体生成DDL。一些实体正在使用JSR 303验证器注释(javax.validation.constraints.Max - 就是其中之一)。

使用Hibernate Tools 4.0.0 CR1 +相关的Ant任务生成DDL。

问题是所有文本列(即使它们可能受@Max(32)限制)都生成为VARCHAR(255)。我试图调试org.hibernate.tool.hbm2ddl.SchemaExport类(和相关的)。从我所看到的,在构造org.hibernate.cfg.Ejb3Column期间没有地方可以包含任何与Validator注释相关的逻辑。

我还尝试修改'hibernate.validator.apply_to_ddl'属性 - 没有任何成功。

任何提示都将不胜感激。

组件/库:

  • JDK 6
  • Hibernate Validator 4.3.0 Final
  • Hibernate Commons Annotations 4.0.2 Final
  • Hibernate Core 4.2.2 Final
  • Hibernate实体管理器4.2.2最终

拉​​法尔

2 个答案:

答案 0 :(得分:1)

hbm2ddl不考虑JSR 303注释。从工具的角度来看,这种意义是有道理的。它为数据库生成“代码”(DDL),而JSR 303又称bean验证在JVM中运行。

要修复数据库中的大小,您需要设置JPA length注释的@Column属性。是的,你需要复制大小约束,但这就是它的方式很难看。

答案 1 :(得分:0)

hbm2ddl 确实考虑了一些Bean验证限制,即@NotNull@Size@Digits和遗留@Length约束由Hibernate Validator定义。

如果您没有看到Hibernate ORM发出的DDL中反映的约束,原因可能是:

  • 类路径上没有Bean Validation提供程序(例如Hibernate Validator);只是Bean Validation API JAR是不够的,因为Hibernate ORM引导实际的验证工厂以获取约束元数据
  • 您没有使用验证模式AUTODDL。只有在这些模式下,约束才会传播到DDL