[英]Manually open a hibernate session with Spring config
我遇到的問題是我使用Spring來管理和加載Web應用程序的休眠狀態。 我目前正在使用OpenSessionInViewFilter。 當我查看應用程序時,這可以按預期工作,但是當我嘗試從與視圖無關的活動(例如Quartz任務或為幫助完成某些任務而創建的某些Runnable線程)訪問休眠時,效果卻不佳。 這將導致延遲初始化異常,並且不會發生會話可用的異常。
這是我目前使用Spring管理Hibernate的方式
<bean id="mainDataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
[..DB config..]
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="mainDataSource"/>
</property>
</bean>
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
<property name="dataSource"><ref local="mainDataSource"/></property>
</bean>
然后,我配置DAO對象,這些對象擴展了HibernateDaoSupport並將它們注入服務類中
<bean id="myDAO"
class="package.myDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="mySvcTarget" class="package.myService">
<property name="myDAO"><ref bean="myDAO"/></property>
</bean>
<bean id="myService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="txManager"/>
</property>
<property name="target">
<ref bean="mySvcTarget"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
因此,在我的應用程序中,將myService注入到我的控制器類中,以便使用它來訪問我的DAO。 就我的情況而言,盡管我似乎需要以其他方式訪問我的DAO(或服務),然后手動打開和關閉休眠會話,因為我的服務類似乎僅在視圖會話期間處於打開狀態。 我不確定這樣做的最佳方法。 所有的休眠配置已經在Spring中存在,所以我假設這只是一個問題或以某種方式調用它們。
首先,Spring正在顯示您正在使用的所有其他服務(非視圖)。 最簡單的方法是使用@Service批注。 為了使其正常工作,您可以在配置中添加<context:component-scan base-package="your.package">
。
之后,如果Spring將您的服務視為Bean,則足以使用@Transactional批注在其中包含Hibernate會話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.