2012-05-07 31 views
1

我使用Hibernate和Spring和我得到在執行以下代碼此異常關聯:非法企圖的集合,在Hibernate中兩次公開會議

Session oSession = getSession(); 
    try 
    { 
     oSession.setFlushMode(FlushMode.COMMIT); 
     getHibernateTemplate().delete(oProject); 
     oSession.flush(); 
     bResult = true; 
    } 
    catch (Exception e) 
    { 
     bResult = false; 
     logger.error(e); 
    } 

我讀過關於Hibernate的一些會話管理和我有一個預感,這段代碼有很差的會話處理。有兩次公開會議的原因是什麼? Hibernate APIs說getSession()函數返回一個新的會話對象或現有的。在這種情況下,它從哪裏獲得現有會話對象?如果它創建一個新的會話對象,那麼處理涉及的集合仍然可以嗎?

任何幫助將不勝感激。提前致謝!更多的功率疊加。

+0

你已經省略了最重要的部分:getSession調用的實際背後是什麼?你打電話給哪個對象?它看起來像你在一些框架內寫這個代碼。 Hibernate自己的方法是'SessionFactory.getCurrentSession'。 –

+0

@MarkoTopolnik - getSession()調用來自Spring框架的HibernateDAOSupport。看起來類已經擴展了,並且使用了該函數。對於缺乏信息抱歉。 – Oneb

回答

0

Hibernate檢查當前線程是否已經打開一個會話。如果不是,則使用SessionFactory創建一個新的;否則它會重新使用已經打開的會話。那麼你可以重新連接實體對象,對於包含實體對象的集合也是如此。

但是您還沒有提到Hibernate如何配置來處理會話。可能是您手動打開會話,並且您發佈的代碼實際上會打開2個會話。

4

HibernateTemplate.delete(Object entity)將使用HibernateTemplate中的其他Session刪除對象,但是您自己打開了一個新的Session對象,這是造成錯誤的根本原因。所以你應該試試如下:

try 
{ 
    getHibernateTemplate().delete(oProject); 
    bResult = true; 
} 
catch (Exception e) 
{ 
    bResult = false; 
    logger.error(e); 
} 
+0

謝謝。我會試試這個,如果有效的話會給予反饋。 – Oneb

相關問題