2010-08-31 34 views
9

Possible Duplicate:
Hibernate: different object with the same identifier value was already associated with the sessionHibernate error: org.hibernate.NonUniqueObjectException: un objeto diferente con el mismo valor de identificador ya estaba asociado con la sesión

tengo casi el mismo problema como ese user.

En mi situación cargo una entidad de db, convierto esta entidad en un DataTransferObject, luego quiero editar un atributo, luego lo vuelvo a convertir en un entityObject, luego actualizo esa entidad e hibernate arroja el siguiente error :

Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 

al parecer, el problema es que el objeto recupero de db tiene el mismo ID que el que quiero poner al día (como debe ser) pero esos no son los mismos objetos!

¿Cómo administrar eso? Gracias por la ayuda ...

Respuesta

24

Su problema es que el objeto que ha cargado previamente, todavía existe en la sesión de hibernación. Veo dos formas de lidiar con eso.

1.) decirle a la sesión de hibernación para fusionar su objeto modificado con el que está en la sesión

session.merge(object) 

2.) lanzar la edad objeto de la sesión antes de escribir el objeto actualizado a la sesión. session.clear() podría funcionar.

+2

merge() no funcionó para mí. Intenté borrar() y desalojar (objeto) con éxito – Silentbang

+0

@Silentbang. Sí, tuve que hacer tanto 'clear()' como 'evict (object)'. Parece que uno o el otro solo deberían funcionar, pero necesitan ambos. –

2

elegir cualquiera de los dos:

1 - puede cerrar la sesión después de cargar la entidad y abrir nueva sesión para la actualización

2 - en lugar de crear nueva Entidad para la actualización , usa el anterior y edítalo.

3 - separar su primera entidad de la sesión - session.evict(myEntity)

+0

Gracias por sus ideas, pero no quiero cerrar la sesión y mi arquitectura no me permite actualizar el objeto anterior (además de un gran esfuerzo) – Sven

+0

@Sven ¿se puede separar la entidad de la sesión? – mhshams

+0

no funciona: javax.servlet.ServletException: org.hibernate.SessionException: ¡La sesión está cerrada! – Sven

0

Más allá de simplemente llamando clear() en la sesión, parece que usted podría tener un problema con la forma en que está usando Hibernate:

Apparently, the problem is that the object I retrieve from db has the same id as the one I want to update (like it should be) BUT those are not the same objects!

¿Quiere decir que usted tiene dos entidades distintas que tienen el mismo ¿CARNÉ DE IDENTIDAD? Si es así, entonces debe encontrar un campo diferente que identifique de manera única a diferentes entidades.

+0

No, son los mismos objetos lógicos/las mismas entidades pero Java les da diferentes ID de objeto – Sven

+0

¿cómo se generan los ''s generados? ¿Qué esquema estás usando? –

11

Este es un problema muy común con Hibernate. Incluso si lo elimina de la sesión, el objeto permanecerá en Hibernate PersistanceContext y tendrá el mismo problema. El problema también proviene del hecho de que session.contains usa la igualdad de objetos, y no equals() para comparar el objeto ...

La historia es la siguiente: usted tiene el objeto A y el objeto B, que son el mismo objeto lógico , pero dos objetos diferentes en tu montón de Java. y hace mucho tiempo que hiciste algo con el objeto A en la sesión.

Ahora, si lo hace session.delete(B) obtendrá la excepción, porque está tratando de eliminar un objeto que tiene la misma clave principal que A, pero no es A.

La solución es simple:

Object findAAgain=session.merge(B); 
session.delete(findAAgain); 

la fusión devuelve la instancia del objeto que tiene en la primera sesión.

Cuestiones relacionadas