第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Hibernate:具有相同標(biāo)識(shí)符值的不同對(duì)象已與會(huì)話關(guān)聯(lián)

Hibernate:具有相同標(biāo)識(shí)符值的不同對(duì)象已與會(huì)話關(guān)聯(lián)

冉冉說 2019-07-25 10:13:50
Hibernate:具有相同標(biāo)識(shí)符值的不同對(duì)象已與會(huì)話關(guān)聯(lián)當(dāng)我使用DAO.update(userbean)時(shí),session.SaveOrUpdate(e);拋出異常:具有相同標(biāo)識(shí)符值的不同對(duì)象已經(jīng)與會(huì)話關(guān)聯(lián)功能如下:    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類的實(shí)例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> ();}每個(gè)groupbean都有一個(gè)角色列表,這些角色沒有更改。在數(shù)據(jù)庫中,組和角色是多對(duì)多映射,例如,我們有一個(gè)groupbean#1,它的角色是:rolebean#1,rolebean#2;groupbean#2,其角色是rolebean#1?,F(xiàn)在我創(chuàng)建一個(gè)新的userbean#1,它的組是groupbean#1,如果我想將rolebean#1添加到userbean#1,它將拋出異常,如標(biāo)題描述我查看了server.log,發(fā)現(xiàn)當(dāng)我使用DAO.save時(shí),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已在會(huì)話中保存兩次,并且它們的標(biāo)識(shí)是相同的。在功能保存(E e)中,如果我使用session.merge(e);更換session.SaveOrUpdate(e);不會(huì)拋出異常,但是角色#1沒有關(guān)聯(lián)到userbean#1有人可以就此提出一些建議嗎?
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果我們能夠看到您將角色bean分配給用戶和組的代碼,那么確定確切原因會(huì)更容易。

通常,異常告訴我們的是該角色bean有兩個(gè)版本(兩個(gè)實(shí)例)。第一個(gè)更新,然后Hibernate命中第二個(gè),并識(shí)別它是相同的標(biāo)識(shí)符,但角色的不同分離版本。

Hibernate不確定哪個(gè)是正確的,并且在saveOrUpdate下,它會(huì)拋出異常讓你知道。

Merge的合同工作方式不同,因?yàn)樗鼤?huì)假設(shè)您打算再次保存它(即合并我的所有更改),因此將重新附加第二個(gè)版本,合并所有更改,并保存任何更新。

我發(fā)表了關(guān)于SaveOrUpdate vs Merge的博客,其中有一些更詳細(xì)的信息來解釋發(fā)生了什么。

如果您想堅(jiān)持使用SaveOrUpdate,您將需要弄清楚您在分配中正在做什么,這導(dǎo)致將角色的不同實(shí)例分配給用戶的角色集合而不是分組。

否則,如果合并的效果對(duì)您有效(符合JPA標(biāo)準(zhǔn)),則使用它。


查看完整回答
反對(duì) 回復(fù) 2019-07-25
  • 1 回答
  • 0 關(guān)注
  • 592 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)