1

我正在从 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 Validator 4.3.0 最终版
  • Hibernate Commons Annotations 4.0.2 最终版
  • Hibernate Core 4.2.2 最终版
  • Hibernate Entity Manager 4.2.2 最终版

拉法尔

4

2 回答 2

1

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

要修复数据库中的大小,您需要设置lengthJPA@Column注释的属性。是的,您需要复制大小约束很丑陋,但就是这样。

于 2013-05-27T12:15:36.370 回答
0

hbm2ddl 确实考虑了一些 Bean Validation 约束,即@NotNull,@Size和Hibernate Validator 定义@Digits的遗留约束。@Length

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

  • 您在类路径上没有 Bean Validation 提供程序(例如 Hibernate Validator);仅仅 Bean Validation API JAR 是不够的,因为 Hibernate ORM 引导一个实际的验证工厂以获取约束元数据
  • 您没有使用验证模式AUTODDL. 只有在这些模式下,约束才会传播到 DDL
于 2018-02-04T12:24:36.430 回答