sábado, 24 de octubre de 2009

Uso de dynamic-insert y dynamic-update en Hibernate

Uso de dynamic-insert y dynamic-update en Hibernate

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.

4 comentarios:

  1. Excelente mi amigo

    Junior

    podria escribirte una pregunta sobre hibernate

    ResponderEliminar
  2. Compañ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.

    ResponderEliminar
  3. Saludos me funcionó sin problemas el dynamic-update , muchas gracias.

    ResponderEliminar