Duplicar posibles:
Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the sessionHibernate: objeto diferente con el mismo valor de identificador ya estaba asociado con la sesión
cuando uso el DAO.update (UserBean), session.SaveOrUpdate(e);
lanzar el Excepción: el objeto diferente con el mismo valor de identificador ya estaba asociado con la sesión
la función es como la siguiente:
public E save(E e) {
Session session = null;
try {
session = sessionFactory.openSession();
log.debug("session="+session.hashCode()+" save "+e);
session.SaveOrUpdate(e); //here throws exception
session.flush();
}
catch (Exception e1) {
log.err("Cannot open hibernate session "+ e1.getMessage()+" cause : "+e1.getCause());
e1.printStackTrace();
}
finally { if (session != null) session.close(); session = null;}
return e ;
}
la UserBean es una instancia de la clase UserBean
public class UserBean{
private List<GroupBean> groups = new ArrayList<GroupBean>();
private List<RoleBean> roles = new ArrayList<RoleBean>();
}
public class GroupBean{
private List<RoleBean> roles = new ArrayList<RoleBean>();
}
cada groupbean tiene una lista de funciones, que no se alteran.
la base de datos, el grupo y el papel es de muchos a muchos mapeo,
por ejemplo,
tenemos una groupbean # 1, es rolebean papeles: # 1, # 2 rolebean;
groupbean # 2, cuyas funciones son rolebean # 1.
ahora crear una nueva UserBean # 1, es grupos es groupbean # 1 y si quiero añadir el rolebean # 1 a UserBean # 1, se produce la excepción como la descripta título
Miro la server.log, y parece que cuando DAO.save usuario, la orden es saveOrUpdate:
userbean#1
|---|-----------***userbean.groups
| | groupbean#1
| | groupbean.roles
| | rolebean#1 # save relebean#1 the first time
| | ---done rolebean#1
| | ------done all rolebeans of group.roles
| | ---done groupbean#1
| |-----------done all groupbeans of userbean.groups
|---|-----------***userbean.roles
| rolebean#1 # save rolebean#1 the second time, and throws exception here!
| ----done rolebean#1
| .....
|-----------done all rolebeans of userbean.roles
la causa de la excepción es rolebean # 1 se ha salvado dos veces en una sesión, y su identidad es la misma .
En la función Guardar (Ee), Si uso
session.merge(e);
reemplazar
session.SaveOrUpdate(e);
no lanzará una excepción, pero el rolebean # 1 no está assocaited a UserBean # 1
alguien puede dar algunas sugerencias al respecto?