when I use the DAO.update(userbean), session.SaveOrUpdate(e);
throw the Exception:different object with the same identifier value was already associated with the session
the function is like next:
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 ;
}
the userbean is an instance of class 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> ();
}
every groupbean has a list of roles, which are not changed.
in database, group and role is many-to-many mapping,
for example,
we have a groupbean#1, it's roles: rolebean#1, rolebean#2;
groupbean#2, which roles are rolebean#1.
now I create a new userbean#1, it's groups is groupbean#1 and if I want to add the rolebean#1 to userbean#1, it will throws the exception like the title descript
I look the server.log, and find that when I user DAO.save, the saveOrUpdate order is:
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
the cause of the exception is rolebean#1 has been saved twice in a session, and their identity is the same.
In the function save(E e), If I use
session.merge(e);
replace
session.SaveOrUpdate(e);
will not throw exception, but the rolebean#1 is not assocaited to userbean#1
anyone can give some suggestions about this? thank you !