Con este ejemplo salgo de la duda del uso de dynamic-insert y dynamic-update de class, cabe mencionar que ambas son opcionales y por default tienen el valor false.
Estructura de la tabla PERSONA
CREATE TABLE PERSONA (
NOMBRE VARCHAR(10),
APELLIDOP VARCHAR(20),
EDAD INTEGER
);
Todos los campos de la tabla aceptan valores nulos.
Insertamos valores y queda como sigue
Uso de dynamic-insert
Tenemos el objeto Persona para realizar la inserción como sigue
Persona persona = new Persona();
persona.setNombre("Nombre");
persona.setApellidoP("ApellidoP");
//persona.setEdad(15);
NOTA: Observamos que la propiedad EDAD contiene el valor NULL.
Dentro del mapeo de la tabla PERSONA en Persona.hbm.xml, tenemos la propiedad dynamic-insert a false
<class name="org.dracof.hibernate.Persona" table="PERSONA"
dynamic-insert="false">
El query del insert generado por hibernate es el siguiente
Hibernate: insert into PERSONA (APELLIDOP, EDAD, NOMBRE) values (?, ?, ?)
Aquí con dynamic-insert a FALSE se hará el insert con todos los campos aun teniendo un valor NULL, por eso se toma en cuenta la columna EDAD
Ahora probamos con dynamic-insert a TRUE , con esto se hará el insert con todos los campos que tengan un valor DIFERENTE DE NULL
<class name="org.dracof.hibernate.Persona" table="PERSONA"
dynamic-insert="true">
El query generado por Hibernate es
Hibernate: insert into PERSONA (APELLIDOP, NOMBRE) values (?, ?)
La columna EDAD ya no es tomada en cuenta por tener el valor NULL.
Uso de synamic-update
Probamos primero el caso de dynamic-update con FALSE
<class name="org.dracof.hibernate.Persona" table="PERSONA"
dynamic-update="false">
Con esto al obtener un registro y aún cuando no se a modificado algun campo de este objeto hibernate actrualiza los valores de todas las columnas aún cuando no se hayan modificado. Para realizar esta prueba se usa el siguiente fragmento de código
Persona persona = (Persona) session.load(Persona.class, "Dracof");
persona.setApellidoP("Dracof XYZ");
session.update(persona);
Vemos que solo se modifico la propiedad ApellidoP sin embargo tambien setea la columna EDAD aun cuando esta no se modifico, el update generado es
Hibernate: update PERSONA set APELLIDOP=?, EDAD=? where NOMBRE=?
Ahora con dynamic-update con TRUE
<class name="org.dracof.hibernate.Persona" table="PERSONA"
dynamic-update="true">
Corremos el mismo ejemplo pero con dynamic-update con TRUE y vemos que solo setea el valor de la columna APELLIDOP y edad no la toma en cuenta porque no se modifico.
Hibernate: update PERSONA set APELLIDOP=? where NOMBRE=?
Codigo Java
Script SQL
Suerte.
Excelente mi amigo
ResponderEliminarJunior
podria escribirte una pregunta sobre hibernate
Que tal, claro, adelante...
ResponderEliminarCompañero cuando utilizo el Insert Dinamico no tengo inconvenientes, pero al utilizar el Update dinamico no me funciona y me setea aquellos datos q no tienen valor en el objeto que puede ser , si yo le estoy colocando la propiedad en el xml, muchas gracias.
ResponderEliminarSaludos me funcionó sin problemas el dynamic-update , muchas gracias.
ResponderEliminar