2013-07-01 5 views
4

Реферат: Я использую Hibernate Tools 4.0.0-CR1 и Hibernate 4.2 (включая Hibernate Validator), но проверки Bean не подбираются. Схема должным образом сгенерирована при развертывании с hibernate.hbm2ddl.auto=create-drop.Почему создание Hibernate Tools hbm2ddl не учитывает аннотации аннотаций Bean?

Но я предпочитаю, чтобы сформировать свой 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-компонента. Согласно the manual, это должно просто работать [tm]. Что я делаю не так?

ответ

2

Вы должны различать апи проверки и Java Persistence API (JPA) (и поставщика конкретных Persistence API). Hibernate учитывает конфигурацию JPA (и hibernate persistence api), и когда вы не предоставляете такую ​​конфигурацию, к этому процессу задействуется принцип . Именно поэтому вы получаете varchar(255) для

@Size(max = 50) 
private String shortTitle; 

она равна (я опущена другие значения по умолчанию)

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

Validation апи участвует в целях проверки. Проверить правильность заполнения полей. Могут существовать различные правила валидации для одного и того же поля.


Обновлено

Я имею в виду этот 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); 
+0

Я думаю, что моя говядина с hibernate заключается в том, что она * также * предоставляет реализацию по умолчанию для проверки bean-компонента. Можете ли вы предоставить источник для «разных правил проверки для поля»? Мое рассуждение состояло в том, что если спящий режим знает, что это поле не может содержать более 50 символов, зачем генерировать более широкий? – mabi

+0

Ах, вы говорите, что правила проверки не являются абсолютными, поэтому генератор ddl не может полагаться на них. Не знал этого, хороший момент. – mabi

-1

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

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

/** User visible short version of the title. */ 
@Column(length = 50) 
private String shortTitle; 
+1

Благодаря отлова С & р потерпеть неудачу. Я должен, вероятно, сформулировать это более четко: я хочу, чтобы Hibernate Tools собирал аннотации проверки (им нужно остаться там для проверки боба), как это делает гибернативный справочник. Я смущен тем, почему спящий режим (ядро) уважает их, а инструменты спящего режима - нет. – mabi

+0

Я столкнулся с этим вопросом. Похоже, что созданный DDL не использует аннотации JSR-303, как указано в руководстве. Вы нашли решение? – Thimmayya