Java 使用Spring配置手动打开hibernate会话
我遇到的问题是,我使用Spring为我的web应用程序管理和加载hibernate。我目前正在使用OpenSessionInViewFilter。当我查看应用程序时,它可以正常工作,但当我试图从与视图无关的活动(如Quartz任务或为帮助执行某些任务而创建的可运行线程)访问hibernate时,它就不能正常工作。这会导致延迟初始化异常,并且不会发生任何会话可用异常 下面是我目前如何使用Spring来管理HibernateJava 使用Spring配置手动打开hibernate会话,java,spring,hibernate,hibernate-session,Java,Spring,Hibernate,Hibernate Session,我遇到的问题是,我使用Spring为我的web应用程序管理和加载hibernate。我目前正在使用OpenSessionInViewFilter。当我查看应用程序时,它可以正常工作,但当我试图从与视图无关的活动(如Quartz任务或为帮助执行某些任务而创建的可运行线程)访问hibernate时,它就不能正常工作。这会导致延迟初始化异常,并且不会发生任何会话可用异常 下面是我目前如何使用Spring来管理Hibernate <bean id="mainDataSource" cla
<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(或者最好是服务),并手动打开和关闭hibernate会话,因为我的服务类似乎只在查看会话期间打开。我不确定这样做的最佳方式。所有的hibernate配置在Spring中都已经存在了,所以我假设这只是个问题,或者以某种方式调用它们。首先,您正在使用的所有附加服务(非视图)应该在Spring中可见。最简单的方法是使用@Service注释。要使其正常工作,您可以在配置中添加
在此之后,如果Spring将您的服务视为一个bean,那么使用@Transactional注释在其中包含Hibernate会话就足够了 应用
@Transactional
将完全有效。无需调用Session Session=sessionFactory.openSession()代码>服务中的CRUD方法?由于@Raymond想要“手动打开和关闭hibernate会话”。那么为web.xml中的org.springframework.orm.hibernate.support.OpenSessionInViewFilter
编写的filter
呢,没有必要删除这个过滤器。@a进一步澄清,我说我想手动打开和关闭会话的唯一原因是因为我认为这是实现我需要的唯一方法。如果我不必这样做,我宁愿不要太多。@sap1ens不幸的是,这不起作用。我按照你的建议做了,但仍然得到了惰性初始化错误。为了安全起见,我将事务注释放在我调用的每个方法上,并将我使用的类标记为事务类,但仍然没有成功