2013-12-17 29 views
2

我工作的web項目中,我要更新用戶到數據庫中。 在寫代碼,我發現如果用作是什麼更新和getHibernateTemplate之間getHibernateTemplate()的差值()。合併

getHibernateTemplate(),它是給一個錯誤更新(用戶),其「非法企圖的集合有兩個打開的會話相關聯;」

但是,如果我嘗試使用getHibernateTemplate().merge(user);相同,它完美地工作正常。 這兩者有什麼區別?而開放會議究竟意味着什麼?

回答

7

合併可以跨會話工作,而更新只適用於同一會話。

儘管兩者都用於轉換處於分離狀態的對象以將對象轉換爲其持久狀態,但只有當我們處於同一會話中時更新纔有效,但即使其會話不同,合併也會起作用。

欲瞭解更多info

通過公開會議,這意味着你目前在同一會話中執行操作(即在會議閉幕前)

+0

+1作爲答案。 –

+0

嘿aditya非常感謝您的回覆,這清除了我對合並和更新的想法 – Nakul91

3

每當你嘗試一次又一次地加載相同的對象到數據庫在這種情況下,更新和合並將出現在圖片中。

在update()方法,如果你保存到數據庫中,然後Hibernate會拋出一個錯誤,因爲我們可以在會議上只更新對象之前修改的對象。

在合併(),打開的會話和以前的會話將獲得合併在一起,對象將得到保存在數據庫中。在休眠

0

兩個更新()和合並()方法被用於這是在分離狀態到持久性狀態的對象進行轉換。 看到下面的代碼:

SessionFactory factory = cfg.buildSessionFactory(); 
Session session1 = factory.openSession(); 

Student s1 = null; 
Object o = session1.get(Student.class, new Integer(101)); 
s1 = (Student)o; 
session1.close(); 

s1.setMarks(97); 

Session session2 = factory.openSession(); 
Student s2 = null; 
Object o1 = session2.get(Student.class, new Integer(101)); 
s2 = (Student)o1; 
Transaction tx=session2.beginTransaction(); 

session2.merge(s1); 

*聽S1處於分離狀態,現在如果我們調用update(),那麼方法Hibernate會拋出一個錯誤,因爲我們可以在會話中只有

更新對象*於是我們打開了另一個會話[會話2],然後加載從數據庫中同一個學生對象,但名字S2

*所以在這個工作階段,我們稱之爲session2.merge(S1);現在變成s2對象s1的變化將被合併並保存到數據庫中

相關問題