日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate中的merge使用详情解说

發布時間:2024/4/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate中的merge使用详情解说 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/lang_man_xing/article/details/7572964

?

merge的作用是:新new一個對象,如果該對象設置了ID,則這個對象就當作游離態處理:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 當ID在數據庫中不能找到時,用update的話肯定會報異常,然而用merge的話,就會insert。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 當ID在數據庫中能找到的時候,update與merge的執行效果都是更新數據,發出update語句;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果沒有設置ID的話,則這個對象就當作瞬態處理:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用update的話,由于沒有ID,所以會報異常,merge此時則會保存數據,根據ID生產策略生成一條數據;

Session session1 = HibernateUtils.getSession();
Transaction transaction1 = session1.beginTransaction();
Students str1 = new Students();
str1.setStu_id(4);
str1.setName("222");
session1.merge(str1);
str1.setName("333");
transaction1.commit();
session1.clear();
session1.close();

下面是當對象在第一個session關閉后,處于游離狀態,第二個session開啟,又get或load一樣的ID的數據出來時,在第二個session中update那個游離態對象,

? ? ? ? ? update肯定會出錯,原因是程序會報持久層中已經有該對象,因為第二個session重新從數據庫中獲取了一個對象成持久態,你的update會讓那個游離態對象也變成持久態,兩個持久態會沖突撒,然而用merge的話,它會把第一個的對象數據賦值給已經處于持久化的那個對象中,自己本身不得變為持久態;(這個我測試很多到的,沒問題)

Session session1 = HibernateUtils.getSession();

Transaction transaction1 = session1.beginTransaction();

Students str1 = (Students)session1.get(Students.class, 2);
transaction1.commit();
session1.clear();
session1.close();

Session session2 = HibernateUtils.getSession();
Transaction transaction2 = session2.beginTransaction();
Students str2 = (Students)session2.get(Students.class, 2);
session2.merge(str1);
transaction2.commit();
session2.clear();

session2.close();


Session session2 = HibernateUtils.getSession();
Transaction transaction2 = session2.beginTransaction();
Students str2 = (Students)session2.get(Students.class, 2);
str1.setName("wer");
session2.merge(str1);
System.out.println(str2.getName()); ?//這里改變了,說明持久態的數據也會改變
str2.setName("ee");
System.out.println(str1.getName()); ? //這里不會改變,說明第一個游離態的數據沒有被持久化撒;
transaction2.commit();
session2.clear();
session2.close();

?

?

=================

http://andylu521.iteye.com/blog/690672

首先, merge作用大致相當于saveorupdate這個方法, 即有唯一性標識, 則運行save, 沒有則運行update

??? 下面來比較2者的區別, update(object), 方法運行后, object是持久化狀態, 而Object obj = merge(object), 方法運行后, object是脫管狀態, obj是持久化狀態

??? 最后比較2者的性能, 本人使用for循環測試10000次, merge: 150ms, update: 50ms, 顯然update性能占優勢.

??? 所以, merge的用法應該是在需要返回被保存的對象時使用.

?

總結

以上是生活随笔為你收集整理的Hibernate中的merge使用详情解说的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。