2011-08-08 12 views
6

he conocido a un escenario:trigger y Hibernate

  1. save o update algunos datos en una tabla de destino de hibernación
  2. hay un gatillo de la tabla de destino que se ejecutará antes de insert o update las operaciones de la tabla de destino
  3. select fuera este registro por Hibernate

Pero me parece que los campos que han sido modificados por el desencadenador no son realmente recuperados. ¿Está esto relacionado con la confirmación de transacciones de Hibernate (ya se ha llamado a flush()) o la memoria caché de hibernación? Gracias.

Respuesta

4

Esto puede ser causado por la primera (sesión) o la segunda (por ejemplo, ehcache) cachés. Para volver a leer la entidad, deberá llamar a session.refresh().

De hibernate docs (en la parte inferior de la sección)

Es posible volver a cargar un objeto y todos sus colecciones en cualquier tiempo, utilizando el método de actualización(). Esto es útil cuando los desencadenadores de base de datos se utilizan para inicializar algunas de las propiedades del objeto.

sess.save(cat); 
sess.flush(); //force the SQL INSERT 
sess.refresh(cat); //re-read the state (after the trigger executes) 
9

Puede asignar propiedades como generated values. Estos valores siempre provienen de la base de datos y no se pueden almacenar. Hibernate carga estos valores automáticamente en una consulta posterior después de insertar o actualizar la base de datos.