Hibernate:具有相同標識符值的不同對象已與會話關聯當我使用DAO.update(userbean)時,session.SaveOrUpdate(e);拋出異常:具有相同標識符值的不同對象已經與會話關聯功能如下: 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 ;}userbean是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> ();}每個groupbean都有一個角色列表,這些角色沒有更改。在數據庫中,組和角色是多對多映射,例如,我們有一個groupbean#1,它的角色是:rolebean#1,rolebean#2;groupbean#2,其角色是rolebean#1?,F在我創建一個新的userbean#1,它的組是groupbean#1,如果我想將rolebean#1添加到userbean#1,它將拋出異常,如標題描述我查看了server.log,發現當我使用DAO.save時,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異常的原因是rolebean#1已在會話中保存兩次,并且它們的標識是相同的。在功能保存(E e)中,如果我使用session.merge(e);更換session.SaveOrUpdate(e);不會拋出異常,但是角色#1沒有關聯到userbean#1有人可以就此提出一些建議嗎?
1 回答

泛舟湖上清波郎朗
TA貢獻1818條經驗 獲得超3個贊
如果我們能夠看到您將角色bean分配給用戶和組的代碼,那么確定確切原因會更容易。
通常,異常告訴我們的是該角色bean有兩個版本(兩個實例)。第一個更新,然后Hibernate命中第二個,并識別它是相同的標識符,但角色的不同分離版本。
Hibernate不確定哪個是正確的,并且在saveOrUpdate下,它會拋出異常讓你知道。
Merge的合同工作方式不同,因為它會假設您打算再次保存它(即合并我的所有更改),因此將重新附加第二個版本,合并所有更改,并保存任何更新。
我發表了關于SaveOrUpdate vs Merge的博客,其中有一些更詳細的信息來解釋發生了什么。
如果您想堅持使用SaveOrUpdate,您將需要弄清楚您在分配中正在做什么,這導致將角色的不同實例分配給用戶的角色集合而不是分組。
否則,如果合并的效果對您有效(符合JPA標準),則使用它。
添加回答
舉報
0/150
提交
取消