天天看點

使用spring的OpenEntityManagerInView

OpenEntityManagerInView和Hibernate的OpenSessionInView一樣,服務端在接收到一個請求的時候開啟EntityManager,在請求結束的時候才去關閉這個EntityManager,和JpaDaoSupport一起可以很好地工作。

使用OpenEntityManagerInView可以解決JPA延遲加載出現的LazyInitialize異常。如果不使用JPA的OpenEntityManagerInViewFilter,那麼當使用玩getJpaTemplate().persist()或者remove()方法後,Spring就會自動關閉EntityManager,是以,你使用了延遲加載的對象加載屬性的時候将會出現LazyInitialize異常。

OpenEntityManagerInViewFilter會把連接配接放到線程池裡面,不是馬上關閉。是以,在請求的過程當中,我們可以随時使用這個EntityManager。當請求結束之後才會關閉這個EntityManager。

不過在高并發的時候,EntityManager的生命周期會比較長(因為請求開始到請求結束這段時間長),EntityManager不會立刻關閉,導緻連接配接池連接配接數占用的問題。是以高并發的系統最好不要使用OpenEntityManagerInView模式。

配置如下,在web.xml裡面添加一個filter:

<filter>

<filter-name>jpaFilter</filter-name>

<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>jpaFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>