Почему при генерации Hibernate Tools hbm2ddl не учитываются аннотации Bean Validation?

Резюме: я использую Hibernate Tools 4.0.0-CR1 и Hibernate 4.2 (включая Hibernate Validator), но проверка компонентов не выполняется. Схема создана правильно при развертывании с помощью hibernate.hbm2ddl.auto=create-drop.

Но я предпочитаю генерировать свой DDL с помощью следующей цели build.xml:

<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=

Я дважды проверил, что банки находятся в моем 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 генерирует правильный «varchar (50)» для «titlename», но общий «varchar (255)» для «shortTitle». Я столкнулся с подобными проблемами с @NotNull и практически с любой другой аннотацией проверки bean-компонентов. Согласно руководству. это должно просто работать [tm]. Что я делаю неправильно?


person mabi    schedule 01.07.2013    source источник


Ответы (2)


Вам необходимо различать API-интерфейсы проверки и API-интерфейсы сохраняемости Java (jpa) (и API-интерфейсы сохраняемости, специфичные для поставщика). Спящий режим учитывает конфигурацию JPA (и 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);
person valery.barysok    schedule 10.01.2016
comment
Я думаю, что моя проблема с спящим режимом заключается в том, что он также обеспечивает реализацию по умолчанию для проверки бина. Можете ли вы предоставить источник того, что для поля могут быть разные правила проверки? Я рассуждал так: если hibernate знает, что это поле никогда не может содержать более 50 символов, зачем генерировать более широкое поле? - person mabi; 10.01.2016
comment
Ах, так вы говорите, что правила проверки не являются абсолютными, поэтому генератор ddl не может на них полагаться. Не знал этого, хорошая мысль. - person mabi; 10.01.2016

Попробуйте удалить @Size(max=50), используйте только @Column(length = 50). Также добавьте @Column(length = 50) в переменную shortTitle.

@NotEmpty @Column(length = 50)
private String titlename;

/** User visible short version of the title. */
@Column(length = 50)
private String shortTitle;
person maimoona    schedule 01.07.2013
comment
Спасибо, что поймали ошибку c&p. Вероятно, мне следует сформулировать это более четко: я хочу, чтобы Hibernate Tools собирал аннотации проверки (они должны оставаться там для проверки bean-компонента), как говорится в руководстве по hibernate. Я не понимаю, почему спящий режим (ядро) уважает их, а инструменты спящего режима - нет. - person mabi; 01.07.2013
comment
Я тоже столкнулся с этой проблемой. Похоже, сгенерированный DDL не использует аннотации JSR-303, как указано в руководстве. Вы нашли решение? - person Thimmayya; 15.10.2013