2009-06-03 12 views
6

El Hibernate JavaDoc indica que Session.update(Object o) generaría una excepción si ya hay una instancia persistente de o, ¿verdad?Hibernate está * NO * lanzando una excepción (creo que debería)

If there is a persistent instance with the same identifier, an exception is thrown.

Sin embargo, el siguiente código no arroja nada cuando lo ejecuto. ¡Y creo que debería!

Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

session.save(email); 
session.update(email); 
session.update(email); 

tx.commit(); 

// didn't throw... Let's try again 

tx = session.beginTransaction(); 

session.update(email); 
session.update(email); 

tx.commit(); 
session.close(); 

// still nothing! :(

Como se puede decir, el doble que trato de hacer múltiples update() s, pero aún Hibernate teniendo fácil en mí.

Alguien tiene una corazonada ¿por qué?

EDIT: parece que sólo tiraría si otro objeto equivalente, por ejemplo, email2 con el mismo ID que email. Supongo que la documentación fue un poco descuidada allí.

+0

Sí! ¡los doctores nunca quieren escribirlo claro y me lleva a esta pregunta! – GMsoF

Respuesta

8

La actualización en Hibernate no está ACTUALIZADA en el lenguaje SQL. Hibernate maneja las ACTUALIZACIONES SQL automáticamente a través de la caché de estado en el objeto Session.

Pero es solo para las entidades cargadas en la sesión actual. Este método, session.update (object), está destinado a unir objetos de otro nivel a la sesión actual para rastrear y, posiblemente, actualizar al final.

En su caso, es solo un NOOP. Se va a lanzar con amargura si:

Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

int id = session.save(email); 
Email anotherEmail = new Email("", "", ""); 
anotherEmail.id = id; 

session.update(anotherEmail); // will throw 

Se puede leer más sobre la semántica de actualización de métodos de Hibernate reference.

+0

¡esta es una solución mejor con un claro ejemplo! – GMsoF

0

¿Puedes probar con un session.flush()? Para ver si eso aumenta la excepción (a veces la confirmación puede no lavar los datos dependiendo del modo de descarga).

Aunque diría que la excepción solo se produce si el objeto se actualizó fuera del alcance de la sesión actual, digamos por un cliente concurrente.

6

No hay error porque es la misma instancia que está actualizando.

Se genera el error si hay una instancia persistente DIFERENTE en la sesión e intenta actualizar().

+0

los obtiene cada vez que –

+1

creo que no es 'instancia persistente DIFERENTE', es' instancia separada DIFERENTE'. – GMsoF

Cuestiones relacionadas