为什么Hibernate工具hbm2ddl生成不考虑Bean验证注释?
小结:我正在使用Hibernate工具4.0.0-CR1和Hibernate 4.2(包括Hibernate验证器),但是Bean验证并没有被接受。使用为什么Hibernate工具hbm2ddl生成不考虑Bean验证注释?,hibernate,hibernate-tools,Hibernate,Hibernate Tools,小结:我正在使用Hibernate工具4.0.0-CR1和Hibernate 4.2(包括Hibernate验证器),但是Bean验证并没有被接受。使用hibernate.hbm2ddl.auto=create drop部署时,架构正确生成 但我更喜欢通过以下build.xml目标生成DDL: <target name="schemaexport" depends="jar" description="Exports a generated schema to DB and files"&
hibernate.hbm2ddl.auto=create drop部署时,架构正确生成
但我更喜欢通过以下build.xml目标生成DDL:
<target name="schemaexport" depends="jar" description="Exports a generated schema to DB and files">
<path id="lib.path">
<fileset refid="lib" />
<pathelement location="${jboss.home}/modules/org/apache/xerces/main/xercesImpl-2.9.1-jbossas-1.jar"/>
<pathelement location="${jar.dir}" />
</path>
<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="lib.path"/>
<hibernatetool destdir="${basedir}">
<classpath refid="lib.path"/>
<jpaconfiguration persistenceunit="TIC" propertyfile="hibernate-console.properties" />
<hbm2ddl outputfilename="${dist.dir}/db_ddl.sql" format="true"/>
</hibernatetool>
<concat destfile="${dist.dir}/tic.sql" fixlastline="yes">
<filelist dir="${dist.dir}" files="db_ddl.sql" />
<filelist dir="${jar.dir}" files="import.sql" />
</concat>
</target>
我仔细检查了JAR是否在我的库路径中
示例实体如下所示:
@Entity
public class Title implements Serializable {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Size(max = 50) @NotEmpty @Column(length = 50)
private String titlename;
@Size(max = 50)
private String shortTitle;
}
这里的问题是hbm2ddl为“titlename”生成了一个合适的“varchar(50)”,但为“shortTitle”生成了一个通用的“varchar(255)”。我在@NotNull和其他bean验证注释中遇到了类似的问题。根据这一点,应该只起作用[tm]。我做错了什么?尝试删除@Size(max=50),仅使用@Column(length=50)。还将@Column(长度=50)添加到变量shortTitle中
@NotEmpty @Column(length = 50)
private String titlename;
/** User visible short version of the title. */
@Column(length = 50)
private String shortTitle;
您需要区分验证api和java持久性api(jpa)(以及特定于供应商的持久性api)。Hibernate会考虑JPA配置(和Hibernate持久性api),当您不提供此类配置时,此过程会涉及到约定优先于配置原则。这就是为什么你会得到varchar(255)
for
@Size(max = 50)
private String shortTitle;
它等于(我省略了其他默认值)
验证api用于验证目的。检查字段是否正确填充。同一字段可能存在不同的验证规则
已更新
我是说这个
对于一个组,验证一个约束;对于另一个组,验证另一个约束
比如说
@NotNull(groups = DefaultGroup.class)
@Null(groups = SecondGroup.class)
private String shortTitle;
然后
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Title>> constraintViolations = validator.validate(title, DefaultGroup.class);
Set<ConstraintViolation<Title>> secondConstraintViolations = validator.validate(title, SecondGroup.class);
Validator Validator=Validation.buildDefaultValidatorFactory().getValidator();
Set constraintViolations=validator.validate(title,DefaultGroup.class);
设置secondConstraintViolations=validator.validate(标题,SecondGroup.class);
感谢您捕捉到c&p故障。我可能应该说得更清楚一些:我希望Hibernate工具能够像Hibernate手册所说的那样获取验证注释(它们需要留在那里进行bean验证)。我不明白为什么hibernate(核心)尊重它们而hibernate工具不尊重它们。我也遇到了这个问题。看起来生成的DDL没有使用手册中指定的JSR-303注释。你找到解决方案了吗?我想我对hibernate的不满在于它还提供了bean验证的默认实现。你能提供“一个字段可以有不同的验证规则”的来源吗?我的推理是,如果hibernate知道这个字段不能包含超过50个字符,为什么要生成一个更宽的呢?啊,你是说验证规则不是绝对的,所以ddl生成器不能依赖它们。我不知道这一点,说得好。
@NotNull(groups = DefaultGroup.class)
@Null(groups = SecondGroup.class)
private String shortTitle;
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Title>> constraintViolations = validator.validate(title, DefaultGroup.class);
Set<ConstraintViolation<Title>> secondConstraintViolations = validator.validate(title, SecondGroup.class);