Hibernate中的merge使用詳情解說
merge的作用是:新new一個對象,如果該對象設置了ID,則這個對象就當作游離態(tài)處理:
當ID在數據庫中不能找到時,用update的話肯定會報異常,然而用merge的話,就會insert。
當ID在數據庫中能找到的時候,update與merge的執(zhí)行效果都是更新數據,發(fā)出update語句;
如果沒有設置ID的話,則這個對象就當作瞬態(tài)處理:
用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關閉后,處于游離狀態(tài),第二個session開啟,又get或load一樣的ID的數據出來時,在第二個session中update那個游離態(tài)對象,update肯定會出錯,原因是程序會報持久層中已經有該對象,因為第二個session重新從數據庫中獲取了一個對象成持久態(tài),你的update會讓那個游離態(tài)對象也變成持久態(tài),兩個持久態(tài)會沖突撒,然而用merge的話,它會把第一個的對象數據賦值給已經處于持久化的那個對象中,自己本身不得變?yōu)槌志脩B(tài);(這個我測試很多到的,沒問題)
- 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()); //這里改變了,說明持久態(tài)的數據也會改變
- str2.setName("ee");
- System.out.println(str1.getName()); //這里不會改變,說明第一個游離態(tài)的數據沒有被持久化撒;
- transaction2.commit();
- session2.clear();
- session2.close();
原文鏈接:http://blog.csdn.net/lang_man_xing/article/details/7572964