Pregunta

Me gustaría utilizar hibernación (ORM), junto con el validador de hibernación. Dentro de la documentación que podemos encontrar los siguientes:

  

Fuera de la caja, Hibernate Anotaciones   (A partir de Hibernate 3.5.x) se traducirá   las limitaciones que se han definido para   sus entidades en el mapeo de metadatos.   Por ejemplo, si una propiedad de su   entidad se anota @NotNull, su   columnas serán declarados como no nula   en el esquema DDL generado por   Hibernate.

Y este es mi código:

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>

y finalmente: 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();
        }   
    }
}

Por lo tanto, sería de esperar que el miCadena columna tendría una longitud de 36 pero tiene 255 (por defecto) y no sería nula, pero es nula (por defecto).

Las impresiones de la consola lo siguiente:

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

Versiones: hibernación-distribución-3.5.4-Final-dist y de hibernación-validador-4.1.0.Final-dist

¿Alguien ve algo mal en mi código? Algunas ideas?

Gracias de antemano

¿Fue útil?

Solución

Bueno, no estás utilizando anotaciones. En lugar de:

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

Trate:

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

I personalmente se movería totalmente a las anotaciones es decir también utilizar las anotaciones para mapear entidades (en realidad, me gustaría mover completamente a JPA 2.0 y utilizar la API de EntityManager). Sin embargo, lo anterior debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top