为什么Hibernate工具hbm2ddl生成不考虑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工具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">
    <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);