2012-03-29 26 views
1

我試圖從最初從數據庫中檢索到的HTTP會話中重新附加到會話中,我通過調用session.lock(object, LockMode.None)來完成此操作,即使鎖定不會級聯此作品也沒關係因爲它不會將更新推送到像merge那樣的數據庫(需要鎖定才能在彈出窗口中打開詳細信息視圖,並且稍後會在主窗口中進行實際保存)。現在令我驚訝的是,我發現如果我的實體具有一對多關係,則對該集合的任何更改都將導致HibernateException「重關聯對象具有髒集合」。Hibernate鎖定會導致髒收集異常

我該如何重新連接對象到會話而不更新數據庫或丟棄對象上的更改呢?

這裏的情況是因爲代碼

EntityA t = createAnEntityA(); 
    Session sess = factory.openSession(); 
    sess.beginTransaction(); 
    sess.save(t); 
    sess.getTransaction().commit(); 
    sess.close(); 
    // t is now saved on the DB but in dettached state 



    // change a simple property 
    sess = factory.openSession(); 
    sess.beginTransaction(); 
    t.setPropertyB("B"); 
    sess.lock(t, LockMode.NONE); 
    // t is attached again, you won't get LazyInitializationException 
    // by calling its properties, although you have to be careful 
    // because the reattachment does not cascade to children 
    sess.getTransaction().commit(); 
    sess.close(); 
    // no updates went to the DB because setPropertyB was called 
    // when t was still dettached 

    // now change a collection 
    EntityC c = createAnEntityC(); 
    t.getCollectionPropertyC().add(c); 
    sess = factory.openSession(); 
    sess.beginTransaction(); 
    sess.lock(t, LockMode.NONE); 
    // Exception is thrown :-(
    sess.getTransaction().commit(); 
    sess.close(); 
+0

是否有可能您的解決方案之間的這個問題的答案之間的某處:http://stackoverflow.com/questions/912659/what-is-the - 合適或更新會立即更改數據庫並刷新將丟失對象中的更改,我想要的是一個簡單的重新附加,所以我不想要重新附加 - 分離 - 對象 - 休眠 – 2012-03-29 13:37:43

+0

當我打開我的詳細視圖彈出窗口時,我沒有獲得延遲加載例外 – ilcavero 2012-03-29 14:02:47

回答

1

恐怕目前這是不可能的,沒有擊中DB。 顯然,由於鎖定命令而發生異常。

有一個Jira報告此行爲。
https://hibernate.atlassian.net/browse/HHH-511

它有2個補丁來解決這個問題。你可以嘗試這些補丁。

但是如果你的問題只是延遲加載收集,你可以考慮使用在Open View中查看模式。 (也許不是最好的模式,但它可以爲你的情況)

+0

您鏈接的錯誤與我的需求並不真正相關,但經過大量研究後,我必須同意您的看法,即沒有可能的方法,休眠。到目前爲止,我的工作是捕獲LazyInitialiationException並調用該catch上的鎖,這樣我只在第一次初始化時鎖定該對象,因此仍未修改 – ilcavero 2012-03-31 22:48:24