Hibernate 基于JSR303验证器注释从实体生成DDL

Hibernate 基于JSR303验证器注释从实体生成DDL,hibernate,ant,Hibernate,Ant,我正在从Hibernate实体生成DDL。一些实体正在使用JSR303验证器注释(javax.validation.constraints.Max-就是其中之一) DDL是使用Hibernate Tools 4.0.0 CR1+相关Ant任务生成的 问题是所有文本列(即使它们可能受到@Max(32)的限制)都生成为VARCHAR(255)。我已经尝试调试org.hibernate.tool.hbm2ddl.SchemaExport类(以及相关的类)。从我所看到的,在构建org.hibernate

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

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

问题是所有文本列(即使它们可能受到@Max(32)的限制)都生成为VARCHAR(255)。我已经尝试调试org.hibernate.tool.hbm2ddl.SchemaExport类(以及相关的类)。从我所看到的,在构建org.hibernate.cfg.ejb3列的过程中,没有包含任何与验证器注释相关的逻辑的地方

我还尝试修改'hibernate.validator.apply_u2;to_uDDL'属性-但没有任何成功

如有任何提示,将不胜感激

组件/库:

  • jdk6
  • Hibernate验证程序4.3.0最终版
  • Hibernate Commons注释4.0.2最终版
  • Hibernate Core 4.2.2最终版
  • Hibernate实体管理器4.2.2最终版本

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


要修复数据库中的大小,需要设置JPA
@列
注释的
length
属性。是的,您需要复制大小约束,这很难看,但事实就是这样

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

要修复数据库中的大小,需要设置JPA
@列
注释的
length
属性。是的,您需要复制大小约束,这很难看,但事实就是这样 HBM2DDL考虑了一些bean验证约束,即“代码> @ NoTnLo.<代码>,<代码> @ Stase,<代码> @数字>代码>以及Hibernate验证器定义的遗留<代码> @长度约束。

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

  • 在类路径上没有Bean验证提供程序(比如Hibernate验证器);仅仅使用Bean验证API JAR是不够的,因为Hibernate ORM引导一个实际的验证工厂以获取约束元数据
  • 您没有使用验证模式
    AUTO
    DDL
    。只有在这些模式下,约束才会传播到DDL
<代码> HBM2DDL确实考虑了一些bean验证约束,即<代码> @ NoTnLo.<代码>、<代码> @ Stase、<代码> @数字>代码>以及由Hibernate验证器定义的遗留<代码> @长度< /COD>约束。

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

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

但它也会忽略Hibernate验证程序注释,如@Length。在我之前的配置中:Hibernate3.3.2+HibernateTools3.4.0,它工作得很好。有什么想法吗?
@Length
是Hibernate专有的非JPA注释。这是两个标准的
@Min
/
@Max
注释的简单快捷方式,对吗?如果
hbm2ddl
曾经支持这一点,我会感到惊讶,但如果你这么说的话……无论如何,AFAIK唯一可靠的选择是
@Column#length
。Marcel-是的,我很确定它确实有效-因为我们升级了Hibernate版本(核心+工具+验证器),生成的DDL不再正确设置文本列的长度。我只能假设这是由于HIbernate较新版本中HIbernate验证器的初始化完全不同(可能是由于支持JSR303)。Hibernate的元数据仍然会得到更新(基于约束),但这是通过org.Hibernate.cfg.beanvalidation.TypeSafeActivator类实现的,该类在创建SessionFactory时运行。无论如何,谢谢你的帮助。干杯这个答案并不完全正确,Hibernate ORM实际上为DDL考虑了一些BV约束。请看我的答案,因为有几个原因你可能看不到这种情况发生。来源:我是Hibernate团队的成员,刚刚成功测试了这个功能。但是它也忽略了Hibernate验证程序注释,比如@Length。在我之前的配置中:Hibernate3.3.2+HibernateTools3.4.0,它工作得很好。有什么想法吗?
@Length
是Hibernate专有的非JPA注释。这是两个标准的
@Min
/
@Max
注释的简单快捷方式,对吗?如果
hbm2ddl
曾经支持这一点,我会感到惊讶,但如果你这么说的话……无论如何,AFAIK唯一可靠的选择是
@Column#length
。Marcel-是的,我很确定它确实有效-因为我们升级了Hibernate版本(核心+工具+验证器),生成的DDL不再正确设置文本列的长度。我只能假设这是由于HIbernate较新版本中HIbernate验证器的初始化完全不同(可能是由于支持JSR303)。Hibernate的元数据仍然会得到更新(基于约束),但这是通过org.Hibernate.cfg.beanvalidation.TypeSafeActivator类实现的,该类在创建SessionFactory时运行。无论如何,谢谢你的帮助。干杯这个答案并不完全正确,Hibernate ORM实际上为DDL考虑了一些BV约束。请看我的答案