我遇到的问题是我使用 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>
然后我配置扩展 HibernateDaoSupport 的 DAO 对象并将它们注入服务类
<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 中已经存在所有休眠配置,所以我假设它只是一个问题或以某种方式调用它们。