为什么Hibernate Tools hbm2ddl生成不考虑Bean Validation注释?

简介:我正在使用Hibernate Tools 4.0.0-CR1和Hibernate 4.2(包括Hibernate Validator),但是没有选择Bean Validations.使用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>

我的hibernate-console.properties如下:

hibernate.connection.password=tic
hibernate.connection.username=tic
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.url=jdbc:postgresql://127.0.0.1:5432/db

hibernate.connection.provider_class=org.hibernate.connection.DriverManagerConnectionProvider
hibernate.datasource=
hibernate.transaction.manager_lookup_class=

我仔细检查了罐子里的jar.path …

示例实体如下所示:

@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验证注释中遇到了类似的问题.根据the manual,这应该工作[tm].我究竟做错了什么?

最佳答案 您需要区分验证api和java持久性api(jpa)(以及供应商特定的持久性api). Hibernate考虑了JPA配置(和hibernate持久性api),当您不提供此类配置时,此过程涉及Convention Over Configuration原则.这就是为什么你得到varchar(255)

@Size(max = 50)
private String shortTitle;

它等于(我省略了其他默认值)

@Size(max = 50)
@Column(length = 255, nullable = true)
private String shortTitle;

验证api用于验证目的.检查字段是否正确填充.可能存在针对同一字段的不同验证规则.

更新

我的意思是这个http://beanvalidation.org/1.0/spec/#constraintsdefinitionimplementation-constraintdefinition-groups.

对于一个组,您验证一个约束,对于其他组,您验证其他约束.

例如

@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);
点赞