日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Hibernate中merge()方法解析

本文教你簡(jiǎn)單學(xué)會(huì)Hibernate merge() add操作,具體的實(shí)現(xiàn)過(guò)程如下:

成都創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的奉化網(wǎng)站建設(shè)公司,奉化接單;提供成都網(wǎng)站制作、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行奉化網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

背景:
◆Account 和 Group 兩個(gè)對(duì)象,設(shè)置了雙向的many-to-many關(guān)系,lazy=true

◆不使用open session in view 模式

◆不使用hibernate二級(jí)緩

◆考慮web應(yīng)用場(chǎng)景,設(shè)置account和group關(guān)聯(lián)時(shí),只需要group和account的id就夠了。

◆數(shù)據(jù)庫(kù)中存在兩個(gè)group: 1.administrators, 2.engineers而po對(duì)象中,group信息為:1.invalid, 2.any one

代碼A:

 
 
 
  1. Account account = (Account) getHibernateTemplate().merge(po);     
  2. Long id = account.getId();     
  3. System.out.println("\tGet obj after added in dao start ...");     
  4. Account readAccount = (Account) getHibernateTemplate().get(     
  5.     Account.class, id);     
  6. System.out.println("\tGet obj after added in dao end ...");     
  7. System.out.println("\tIs po==readAccount ? " + (po == readAccount));     
  8. System.out.println("\tShow detai of po: " + po.toDetailString());     
  9. System.out.println("\tShow detai of readAccount: " + readAccount.toDetailString());   
  10.  

其中,為po設(shè)置了兩個(gè)group 輸出結(jié)果:

 
 
 
  1. Hibernate: select ... from SYS_GROUPS where ID=?     
  2. Hibernate: select ... from SYS_GROUPS where ID=?     
  3.     Get obj after added in dao start ...     
  4.     Get obj after added in dao end ...     
  5.     Is po==readAccount ? false    
  6.     Show detai of po: Account[0.account_22, groups[2.any one 1.invalid ]]  
  7.     Show detai of readAccount: Account[22.account_22, groups[2.engineers 1.administrators ]]  
  8. Hibernate: insert into SYS_ACCOUNTS (...) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)     
  9. Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)     
  10. Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)   
  11.  

代碼B:

 
 
 
  1. Long id = (Long) getHibernateTemplate().save(po);     
  2. System.out.println("\tGet obj after added in dao start ...");     
  3. Group group = (Group)getHibernateTemplate().get(Group.class,new Long(1));     
  4. System.out.println("\tGroup detai:" + group.toString());     
  5. Account readAccount = (Account) getHibernateTemplate().get(     
  6.     Account.class, id);     
  7. System.out.println("\tGet obj after added in dao end ...");     
  8. System.out.println("\tIs po==readAccount ? " + (po == readAccount));     
  9. System.out.println("\tShow detai of po: " + po.toDetailString());     
  10. System.out.println("\tShow detai of readAccount: "    
  11.     + readAccount.toDetailString());     
  12.     
  13. getHibernateTemplate().merge(readAccount);     
  14. Account readAgain = (Account) getHibernateTemplate().get(Account.class,     
  15.     id);     
  16. System.out.println("\tIs po==readAgain ? " + (readAgain == po));     
  17. System.out.println("\tIs readAgain== readAccount? "    
  18.     + (readAgain == readAccount));     
  19. System.out.println("\tShow detai again: " + readAgain.toDetailString());    
  20.  

輸出結(jié)果:

 
 
 
  1.     Get obj after added in dao start ...     
  2. Hibernate: select ... from SYS_GROUPS where ID=?     
  3.     Group detai:Group 1. administrators     
  4.     Get obj after added in dao end ...     
  5.     Is po==readAccount ? true    
  6.     Show detai of po: Account[27.account_27, groups[1.invalid 2.any one ]]  
  7.     Show detai of readAccount: Account[27.account_27, groups[1.invalid 2.any one ]]  
  8. Hibernate: select ... from SYS_GROUPS where ID=?     
  9.     Is po==readAgain ? true    
  10.     Is readAgain== readAccount? true    
  11.     Show detai again: Account[27.account_27, groups[1.administrators 2.engineers ]]  
  12. Hibernate: insert into SYS_ACCOUNTS (...) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)     
  13. Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)     
  14. Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)    
  15.  

結(jié)論:

1. Hibernate merge()方法會(huì)導(dǎo)致執(zhí)行查詢(xún)group對(duì)象的select語(yǔ)句,在調(diào)用merge()命令時(shí)立即執(zhí)行(條件:目標(biāo)group對(duì)象沒(méi)有被緩存)

2. 無(wú)論Hibernate merge()或save()方法,insert語(yǔ)句都在***執(zhí)行,并非在調(diào)用相應(yīng)命令時(shí)立即執(zhí)行

3. 直接調(diào)用merge()方法時(shí),會(huì)返回一個(gè)新的instance,原po保持不變

4. save()之后,po中的group對(duì)象并沒(méi)有被關(guān)聯(lián)到session,因此查詢(xún)group(id=1)會(huì)觸發(fā)select語(yǔ)句

5. save()之后,po對(duì)象被關(guān)聯(lián)到session,再次查詢(xún),不會(huì)觸發(fā)select語(yǔ)句,并且不會(huì)檢查group對(duì)象是否被關(guān)聯(lián)到session

6. save()之后再調(diào)用merge,返回的是同一個(gè)instance,但其關(guān)聯(lián)group對(duì)象會(huì)被更新

如果在add一個(gè)對(duì)象之后,如果存在關(guān)聯(lián)對(duì)象,并且需要再同一個(gè)hibernate session中進(jìn)行回顯,則建議使用Hibernate merge()方法。

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

【編輯推薦】

  1. 淺析Hibernate延遲加載
  2. Hibernate屬性簡(jiǎn)單分析
  3. Struts-Spring-Hibernate案例
  4. Hibernate Sessin接口常用方法
  5. Hibernate事務(wù)全面介紹

文章名稱(chēng):Hibernate中merge()方法解析
分享URL:http://m.5511xx.com/article/cogjcjj.html