標籤:
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();
Hibernate中的merge使用詳情解說