2012-07-25 74 views
1

可能重複:
Hibernate: different object with the same identifier value was already associated with the sessionHibernate中是否有覆蓋函數會覆蓋會話中具有相同標識符的對象? (未合併())

我有Hibernate的一個問題:

我有下面的類:人

我從服務器端的數據庫中加載特定的Person.class「A」。 然後我通過一個JSP頁面將這個對象呈現給客戶端。

客戶端操縱「A」到「B」,並且然後經由形式將其發送回。我將服務器端的Person.class「B」對象加載到一個新變量中,然後嘗試存儲它。

但作爲整個應用程序是基於會話我不能簡單地調用:

HibernateTemplate.saveOrUpdate("B"); 

相反,我必須在保存前合併「B」與「A」。

但是,當我打電話

HibernateTemplate.merge("B"); 

的「B」的對象仍然得到「A」,我不希望再存儲的所有屬性。我希望「B」完全替換「A」對象,而不通過合併它們來獲得某些「A」屬性。

所以我的問題是:

有沒有在Hibernate中的任何「覆蓋」或「替換」功能,可以覆蓋所有會話中的其中有一個特定對象的屬性相同標識符的對象?

(在這個例子中,從形式返回的對象「B」)

還應防止休眠的抱怨:

Exception in thread "main" org.hibernate.NonUniqueObjectException: a 
different object with the same identifier value was already associated 
with the session: 
+0

我不知道我的理解。如果你想更換B A,則只需從數據庫中刪除,並添加B. – 2012-07-25 14:04:01

+0

,謝謝,我已經這樣做了previos我明確的解決方案。那也可以起作用。 – ndrizza 2012-07-25 16:15:36

回答

0

你可以從你的會話時的第一驅逐對象然後使用更新來將其他對象附加到會話中。

我會在你的服務做到這一點:

sessionFactory.getCurrentSession().evict(myObject); 
sessionFactory.getCurrenctSession().update(myNewerObject); 

你不應該在你的控制器做任何數據庫操作,因爲這將需要事務控制器的方法。

+0

我試圖在控制器傳遞給jsp之前做到這一點..但後來jsp無法再訪問該對象..在哪一點你會驅逐它? – ndrizza 2012-07-25 14:03:59

+0

更新回答 – 2012-07-25 15:24:47

+0

謝謝。我可以通過合併解決我的問題。這個問題在另一個ArrayList中沒有被Hibernate管理,我不得不自己管理自己..我做了一個完整的刪除操作,而不是在列表中插入所有對象。我認爲映射將由休眠處理...感謝您的幫助。如果您的代碼正常工作,我現在無法告訴您。 – ndrizza 2012-07-25 16:14:34