Question

Je voudrais utiliser mise en veille prolongée (ORM) avec mise en veille prolongée validateur. Au sein de la documentation que nous pouvons trouver ce qui suit:

  

Hors de la boîte, Hibernate Annotations   (En veille prolongée 3.5.x) se traduira par   les contraintes que vous avez définies pour   vos entités dans les métadonnées de cartographie.   Par exemple, si une propriété de votre   entité annotées @NotNull, son   colonnes seront déclarés comme non nul   dans le schéma DDL généré par   Mise en veille prolongée.

Et voici mon code:

test / 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;
    }   
}

test / 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>

et enfin: 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();
        }   
    }
}

Alors, j'attendre à ce que la myString colonne aurait une longueur de 36, mais il a 255 (par défaut) et ne serait pas nulle, mais elle est nulle (la valeur par défaut).

Les impressions de la console qui suit:

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 (?)

Versions: mise en veille prolongée distribution-3.5.4-finale-dist et hibernate-validateur-4.1.0.Final-dist

Quelqu'un voit-il quelque chose de mal dans mon code? Toutes les idées?

Merci à l'avance

Était-ce utile?

La solution

Eh bien, vous n'utilisez pas annotations. Au lieu de:

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

Essayez:

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

Je personnellement complètement passer à des annotations à savoir également utiliser des annotations à la carte des entités (en fait, je complètement passer à JPA 2.0 et utiliser l'API EntityManager). Mais le travail doit ci-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top