成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hibernate中merge()方法解析

開發 后端
Hibernate merge()方法會導致執行查詢group對象的select語句,在調用merge()命令時立即執行(條件:目標group對象沒有被緩存)。

本文教你簡單學會Hibernate 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:

  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設置了兩個group 輸出結果:

  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.  

輸出結果:

  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.  

結論:

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

2. 無論Hibernate merge()或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中進行回顯,則建議使用Hibernate merge()方法。

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

【編輯推薦】

  1. 淺析Hibernate延遲加載
  2. Hibernate屬性簡單分析
  3. Struts-Spring-Hibernate案例
  4. Hibernate Sessin接口常用方法
  5. Hibernate事務全面介紹
責任編輯:仲衡 來源: blogjava
相關推薦

2009-06-16 16:27:22

Hibernate優化

2009-06-12 15:09:01

Hibernate優化

2012-05-17 10:16:00

HibernateJavamerge

2009-06-12 16:00:13

Session方法Hibernate

2009-06-03 10:20:11

Hibernate事務管理配置

2011-04-02 14:06:46

SQL Server MERGE

2023-01-05 11:34:46

PandasMerge方法

2009-06-03 10:49:48

Hibernate事務

2009-09-23 15:12:41

Hibernate視圖

2009-06-18 09:14:08

Hibernate H

2009-11-24 18:18:21

PHP函數array_

2009-06-26 16:23:12

Hibernate gHibernate l

2009-06-11 14:40:59

Hibernate分頁Hibernate查詢

2009-09-22 10:50:04

Hibernate c

2009-09-23 16:54:08

Hibernate修改

2009-09-23 09:47:23

Hibernate e

2009-09-27 14:41:05

Hibernate I

2009-09-23 13:23:12

Hibernate M

2009-06-03 10:02:53

Hibernate批量刪除

2010-10-08 12:46:27

Javascriptreplace()
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲码欧美码一区二区三区 | www.久久| 精品91久久 | 天天操天天天 | av色站| 日日摸日日添日日躁av | 国产精品99精品久久免费 | 日韩一级精品视频在线观看 | 国产成人av一区二区三区 | 国产高清在线观看 | 男女羞羞视频在线看 | 午夜小电影 | 九九av | 国产农村一级片 | 激情五月婷婷丁香 | 国产成人精品区一区二区不卡 | 国产精品免费播放 | 婷婷丁香综合网 | 欧美精品综合在线 | 在线观看a视频 | 97精品国产 | av中文字幕在线 | 97国产爽爽爽久久久 | 成人欧美一区二区三区在线观看 | 精品在线一区 | 日本精品久久 | 视频一区在线 | 国产成人99久久亚洲综合精品 | 久久久久久91| 一区欧美 | 日韩一区二区三区在线 | 亚洲一区视频在线 | 久久久国产一区二区三区四区小说 | 亚洲国产aⅴ精品一区二区 免费观看av | 在线观看国产视频 | 97视频免费 | 久久久久欧美 | 国产午夜精品一区二区三区四区 | 成人亚洲视频 | 中文字幕高清一区 | 国产一级电影在线观看 |