hibernación validador
-
29-09-2019 - |
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
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.