merge的作用是:新new一個對象,如果該對象設置了ID,則這個對象就當作遊離態處理:當ID在資料庫中不能找到時,用update的話肯定會報異常,然而用merge的話,就會insert。下面學步園小編來講解下Hibernate中的merge怎麼使用?
Hibernate中的merge怎麼使用
當ID在資料庫中能找到的時候,update與merge的執行效果都是更新數據,發出update語句;
如果沒有設置ID的話,則這個對象就當作瞬態處理:
用update的話,由於沒有ID,所以會報異常,merge此時則會保存數據,根據ID生產策略生成一條數據;
Sessionsession1=HibernateUtils.getSession();
Transactiontransaction1=session1.beginTransaction();
Studentsstr1=newStudents();
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的話,它會把第一個的對象數據賦值給已經處於持久化的那個對象中,自己本身不得變為持久態;
Hibernate中的merge怎麼使用
Sessionsession1=HibernateUtils.getSession();
Transactiontransaction1=session1.beginTransaction();
Studentsstr1=(Students)session1.get(Students.class,2);
transaction1.commit();
session1.clear();
session1.close();
Sessionsession2=HibernateUtils.getSession();
Transactiontransaction2=session2.beginTransaction();
Studentsstr2=(Students)session2.get(Students.class,2);
session2.merge(str1);
transaction2.commit();
session2.clear();
session2.close();
Sessionsession2=HibernateUtils.getSession();
Transactiontransaction2=session2.beginTransaction();
Studentsstr2=(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怎麼使用」的內容,希望對大家有用。更多資訊請關注學步園。學步園,您學習IT技術的優質平台!