一尘不染

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

hibernate

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

我的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在我的lib.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验证批注中都遇到了类似的问题。根据手册,这应该可以正常工作[tm]。我究竟做错了什么?


阅读 225

收藏
2020-06-20

共1个答案

一尘不染

您需要区分验证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);
2020-06-20