Hibernate學習筆記 merge()方法–add對象

來源:互聯網
上載者:User

merge

add操作

背景:
    Account 和 Group 兩個對象,設定了雙向的many-to-many關係,lazy=true
    不使用open session in view 模式
    不使用hibernate二級緩衝

    考慮web應用情境,設定account和group關聯時,只需要group和account的id就夠了。
    資料庫中存在兩個group: 1.administrators, 2.engineers
    而po對象中,group資訊為:1.invalid, 2.any one

代碼A:
Account account = (Account) getHibernateTemplate().merge(po);<br />Long id = account.getId();<br />System.out.println("/tGet obj after added in dao start ...");<br />Account readAccount = (Account) getHibernateTemplate().get(<br />Account.class, id);<br />System.out.println("/tGet obj after added in dao end ...");<br />System.out.println("/tIs po==readAccount ? " + (po == readAccount));<br />System.out.println("/tShow detai of po: " + po.toDetailString());<br />System.out.println("/tShow detai of readAccount: " + readAccount.toDetailString());<br />

   其中,為po設定了兩個group

輸出結果:
Hibernate: select ... from SYS_GROUPS where ID=?<br />Hibernate: select ... from SYS_GROUPS where ID=?<br />Get obj after added in dao start ...<br />Get obj after added in dao end ...<br />Is po==readAccount ? false<br />Show detai of po: Account[0.account_22, groups[2.any one 1.invalid ]]<br />Show detai of readAccount: Account[22.account_22, groups[2.engineers 1.administrators ]]<br />Hibernate: insert into SYS_ACCOUNTS (...) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)<br />Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)<br />Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)<br />

 

代碼B:

Long id = (Long) getHibernateTemplate().save(po);<br />System.out.println("/tGet obj after added in dao start ...");<br />Group group = (Group)getHibernateTemplate().get(Group.class,new Long(1));<br />System.out.println("/tGroup detai:" + group.toString());<br />Account readAccount = (Account) getHibernateTemplate().get(<br />Account.class, id);<br />System.out.println("/tGet obj after added in dao end ...");<br />System.out.println("/tIs po==readAccount ? " + (po == readAccount));<br />System.out.println("/tShow detai of po: " + po.toDetailString());<br />System.out.println("/tShow detai of readAccount: "<br />+ readAccount.toDetailString());</p><p>getHibernateTemplate().merge(readAccount);<br />Account readAgain = (Account) getHibernateTemplate().get(Account.class,<br />id);<br />System.out.println("/tIs po==readAgain ? " + (readAgain == po));<br />System.out.println("/tIs readAgain== readAccount? "<br />+ (readAgain == readAccount));<br />System.out.println("/tShow detai again: " + readAgain.toDetailString());<br />

輸出結果:
Get obj after added in dao start ...<br />Hibernate: select ... from SYS_GROUPS where ID=?<br />Group detai:Group 1. administrators<br />Get obj after added in dao end ...<br />Is po==readAccount ? true<br />Show detai of po: Account[27.account_27, groups[1.invalid 2.any one ]]<br />Show detai of readAccount: Account[27.account_27, groups[1.invalid 2.any one ]]<br />Hibernate: select ... from SYS_GROUPS where ID=?<br />Is po==readAgain ? true<br />Is readAgain== readAccount? true<br />Show detai again: Account[27.account_27, groups[1.administrators 2.engineers ]]<br />Hibernate: insert into SYS_ACCOUNTS (...) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)<br />Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)<br />Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)<br />  

結論:

 1. merge()方法會導致執行查詢group對象的select語句,在調用merge()命令時立即執行(條件:目標group對象沒有被緩衝)

 2. 無論merger()或save()方法,insert語句都在最後執行,並非在調用相應命令時立即執行

 3. 直接調用merge()方法時,會返回一個新的instance,原po保持不變

 4. save()之後,po中的group對象並沒有被關聯到session,因此查詢group(id=1)會觸發select語句

 5. save()之後,po對象被關聯到session,重新查詢,不會觸發select語句,並且不會檢查group對象是否被關聯到session

 6. save()之後再調用merge,返回的是同一個instance,但其關聯group對象會被更新

    如果在add一個對象之後,如果存在關聯對象,並且需要再同一個hibernate session中進行回顯,則建議使用merge()方法。

參考:
    Hibernate Session.merge() javadoc
    open session in view 模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.