2010-08-18 1 views
3

Я хотел бы использовать hibernate (orm) вместе с валидатором спящего режима. В документации можно найти следующее:hibernate validator

Из коробки, Hibernate Аннотация (по состоянию на Hibernate 3.5.x) переведет ограничения, которые вы определили для ваших сущностей в метаданные отображения. Например, если свойство вашего объекта аннотируется @NotNull, его столбцы будут объявлены как не null в схеме DDL, сгенерированной Спящий режим.

И это мой код:

тест/MyClass.java

public class MyClass implements Serializable 
{ 
    private long id; 
    @Length(max=36) 
    @NotNull 
    private String myString; 

    public MyClass() {}; 

    public MyClass(String myString) 
    { 
     this.myString = myString; 
    } 

    public long getId() 
    { 
     return id; 
    } 

    public void setId(long id) 
    { 
     this.id = id; 
    } 

    public String getMyString() 
    { 
     return myString; 
    } 

    public void setMyString(String myString) 
    { 
     this.myString = myString; 
    } 
} 

тест/MyClass.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 2010-08-02 21:13:04 by Hibernate Tools 3.3.0.GA --> 
<hibernate-mapping> 
    <class name="test.MyClass" table="my_table" > 
     <id name="id" type="long" unsaved-value="0"> 
      <column name="id" /> 
      <generator class="native"/> 
     </id> 
     <property name="myString" type="string"> 
      <column name="my_string"/> 
     </property> 
    </class> 
</hibernate-mapping> 

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
             "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost/htest</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password">root</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <property name="hibernate.show_sql">true</property> 


    <!-- Mapping files --> 
    <mapping resource="test/myClass.hbm.xml"/> 
</session-factory> 
</hibernate-configuration> 

и, наконец: Test.java

public class Test 
{ 
    public static void main(String[] args) 
    {      
     Session session = null; 
     SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

     MyClass str1 = null; 
     Transaction tx = null; 
     try 
     { 
      session = sessionFactory.openSession(); 
      tx = session.beginTransaction(); 
      str1 = new MyClass("hello"); 
      session.save(str1); 
      tx.commit(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      session.close(); 
     } 
    } 
} 

Итак, я хотел бы ожидать, что столбец туЗЬптд будет иметь длину 36, но она имеет 255 (по умолчанию) и будет не нулевой, но он является недействительным (по умолчанию).

Консоль печатает следующие:

16:35:46,641 INFO SchemaUpdate:155 - Running hbm2ddl schema update 
16:35:46,642 INFO SchemaUpdate:167 - fetching database metadata 
16:35:46,644 INFO SchemaUpdate:179 - updating schema 
16:35:46,647 INFO DatabaseMetadata:119 - table not found: my_table 
16:35:46,649 INFO DatabaseMetadata:119 - table not found: my_table 
16:35:46,650 DEBUG SchemaUpdate:203 - create table my_table (id bigint not null auto_increment, my_string varchar(255), primary key (id)) 
16:35:46,755 INFO SchemaUpdate:217 - schema update complete 
16:35:46,793 DEBUG SQL:111 - insert into my_table (my_string) values (?) 
Hibernate: insert into my_table (my_string) values (?) 

Версии: Hibernate-распределение-3.5.4-Final-Dist и Hibernate-валидатор-4.1.0.Final-DIST

Кто-нибудь увидеть что-то неправильно в моем коде? Есть идеи?

Заранее спасибо

ответ

2

Ну, вы не с помощью аннотаций. Вместо того, чтобы:

SessionFactory sessionFactory = new Configuration() 
    .configure() 
    .buildSessionFactory(); 

Try:

SessionFactory sessionFactory = new AnnotationConfiguration() 
    .configure() 
    .buildSessionFactory(); 

Я лично полностью перейти к аннотации т.е. также использовать аннотации к карте объектов (на самом деле, я бы полностью перейти на JPA 2.0 и использовать EntityManager API). Но вышеприведенное должно работать.

+0

AnnotationConfiguration (вместо конфигурации). Благодаря! – peter

+0

@ piotr286: Добро пожаловать. –