2012-09-07 172 views
0

我想在我的Web應用程序中使用Spring + Hibernate。 我的應用程序沒有使用Spring編寫。 當「打開頁面」操作被調用時,我打開Hibernate Session,將它存儲在Http Session中並在我的DAO之間共享。當保存操作被調用時,我使用舊會話開始事務。春季休眠 - 共享會話DAOs

但現在我想將我的舊DAO遷移到基於HibernateDaoSupport的DAO。 在這種情況下,我該如何分享會話?如果我的DAO引用beans.xml中的一個SessionFactory,它們將共享相同的會話嗎? 如何在這種情況下管理會話(打開新的或使用舊的)?

我寫了下面的代碼,但我得到

org.hibernate.LazyInitializationException:無法初始化代理 - 沒有會話

頁上的System.out.println(obj.getCategory()的getName( ));

public class CategoryObjectDAOSpringImpl extends HibernateDaoSupport implements CategoryObjectDAO { 

@Override 
public CategoryObject get(int id) throws Exception { 


    CategoryObject obj = getHibernateTemplate().get(CategoryObject.class, id); 

    System.out.println(obj.getId()); 


    System.out.println(obj.getCategory().getName()); 

    for (ObjAttrCommon objAttr : obj.getAttributes()) { 
     //objAttr.setSession(getSession()); 
     System.out.println(objAttr.getId()); 
    } 

    return obj; 
} 

奇怪的是,如果我添加

getSessionFactory().openSession(); 

呼叫頂部我有同樣的exeption。

回答

0

我覺得same awswer是有效的這篇文章:

如果你的「unit of work」不能按要求自動,我認爲你可以在你的服務層使用事務手動創建它。事情是這樣的:

public Object serviceMethod(params) { 
    TransactionTemplate transactionTemplate = getHibernateTemplate().get(CategoryObject.class, id); 
    transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
     public void doInTransactionWithoutResult(TransactionStatus status) { 
     try { 
     // call your DAO's to update/delete/... and set values to service 
     } catch (DAOException e) { 
     LOGGER.error(e); 
     throw new ServiceException(e); 
     } 
    } 
}); 
} 

EDITED:所以交流中心的例外出現在事務內。確保問題不在您看來。如果在你使用HibernateTemplate檢索你的實體後,你從視圖中訪問它,它將解釋LazyException,因爲當你從視圖訪問你的對象時,你的Hibernate會話將已經關閉。

在您使用JSP/JSF中的模型時,需要擴展您的工作單元以涵蓋所有請求上下文。您必須包含一個過濾器來管理您的Hibernate會話開放,即所謂的Open Session In Pattern模式,take a look at this。 複製此帖子中顯示的過濾器實現並將其包含在您的應用程序中,它應該解決問題。

+0

如果我這樣做,我得到LazyInitializationException。會議和交易似乎已經完成後關閉。 – sanek

+0

在服務層/ DAO層中執行Hibernate查詢時,或者在視圖(JSP/JSF)中訪問對象時,會顯示lazyinitializationException? – kothvandir

+0

我編輯了我的反應,解釋瞭如何解決視圖會話問題。 – kothvandir