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?或者你可以建議其他的方法來實現這一點?
用戶檢查項目列表。用戶從列表中選擇一個項目並對其進行編輯。然後他/她保存更改或取消它們。稍後,當他完成編輯所有項目時,他可以選擇全部保存或全部取消。對於此功能,我應該只在用戶單擊Save All時更新數據庫。對於「中間保存/取消」操作,如果用戶選擇取消,我必須創建對象的副本。用戶也可以多次編輯同一項目(編輯對象A保存,編輯對象B保存,然後重新編輯A並保存)。 – exoz
如果我調用刷新,我認爲對象再次從數據庫中獲取值,那麼我將失去以前的更改。 – exoz
@exoz:如果需要對象的副本,最好手動克隆對象(可能使用'Clobeable'),而不是依靠Hibernate來完成。 – axtavt