2011-09-20 89 views

回答

2

如果在請求/請求結束時意味着http請求,那麼通常通過一個servlet過濾器來完成,該servlet過濾器會爲您打開/關閉會話。這種設計模式稱爲OpenSessionInView(Filter)。你可以得到詳細信息here

僅當應用程序呈現在存在Hibernate Session的相同JVM中時,此模式纔有用。如果您的數據訪問層位於與視圖渲染層不同的JVM上,則您必須(急切地)獲取所有必需的模型bean,然後分派呈現視圖的請求。

如果您使用的是spring(或EJB3),您可以將Session(EntityManager)注入到您的數據訪問類中,因此您無需手動處理打開和關閉會話。

理想情況下,您不應該需要手動打開/關閉會話/事務(因爲它會遺漏session.close()或tx.commit()等)的機會。而是使用容器提供的JPA entitymanager或者使用spring來爲你管理它。

+0

同意。另外,如果你使用Spring MVC,它提供了一個'OpenSessionInViewFilter'和一個'OpenSessionInViewInterceptor'。 – SingleShot

1

有使用會話的多種模式,但最常見的,通常正確的一個是打開和關閉它在每個請求(=線程=工作單位)

在JavaEE的環境中,你通常會利用JPA。所以休眠通過EntityManager,可以在部件被注射(如EJB或CDI管理豆)與@PersistenceContext

0

通常是會話中使用需要訪問數據存儲時是打開的(例如事務開始)。何時關閉它有不同的模式和方法。您可以保持會話在視圖(jsps)中打開。但你不必這樣做。

例如我們的一個項目不允許使用opensessionInView過濾器。所以會議在交易結束後關閉。所有數據(Value對象基本上)需要發送的視圖都在調度之前加載。