2012-01-23 32 views
0

我試圖實現保存更改/取消更改屏幕。休眠新創建的對象合併失敗

我有一個主要的休眠會話。當有人想編輯一個對象時,我創建一個臨時會話併合並來自主會話的對象。

// To edit Object x with id id_x 
Object a = mainSession.get(id_x); 
Object b = tempSession.merge(a); 

// Change object b with tempSession 

// If save: mainSession.merge(b) and discard tempSession. 
// If cancel: discard b and tempSession. 

... 
... 

// If saveAll: mainSession.flush(); 
// If cancellAll: mainSession.rollback(), reload all objects. 

這適用於已經在數據庫中的項目。但是,當我想用​​新創建的對象tempSession.merge(a)失敗時應用相同的邏輯。

Object d = new Object(); 
mainSession.save(d); 
// To edit Object d with id id_d 
Object a = mainSession.get(id_d); 
Object b = tempSession.merge(a); // The application gets blocked/locked here. 

我認爲tempSession.merge試圖從數據庫加載對象,因爲tempSession沒有對象與id_d但因爲對象不在數據庫或表/行存在被鎖定失敗。有沒有辦法創建對象d的副本,並將其附加到tempSession,然後重新將它附加到mainSession?或者你可以建議其他的方法來實現這一點?

回答

0

你是否真的需要這兩個會話這個複雜的設置?一般而言,由於可能的死鎖,您不應該在同一個線程中同時使用多個會話。

有許多方法可以在不使用多個會話的情況下實現所需的行爲。例如,您可以從會話中加載對象並稍後將其合併到同一個會話中。或者您可以保留該對象,並在您想放棄更改時致電refresh()

+0

用戶檢查項目列表。用戶從列表中選擇一個項目並對其進行編輯。然後他/她保存更改或取消它們。稍後,當他完成編輯所有項目時,他可以選擇全部保存或全部取消。對於此功能,我應該只在用戶單擊Save All時更新數據庫。對於「中間保存/取消」操作,如果用戶選擇取消,我必須創建對象的副本。用戶也可以多次編輯同一項目(編輯對象A保存,編輯對象B保存,然後重新編輯A並保存)。 – exoz

+0

如果我調用刷新,我認爲對象再次從數據庫中獲取值,那麼我將失去以前的更改。 – exoz

+0

@exoz:如果需要對象的副本,最好手動克隆對象(可能使用'Clobeable'),而不是依靠Hibernate來完成。 – axtavt