【问题标题】:Hibernate session management with Spring and JAX-WS使用 Spring 和 JAX-WS 进行休眠会话管理
【发布时间】:2011-04-18 13:41:07
【问题描述】:
我有一个使用 Hibernate 进行持久性的应用程序,并且正在尝试实现一个 JAX-WS 接口(使用 Spring 框架公开它)。我还有一个调用持久层中的方法的服务类(用@WebService 和@WebMethod 注释)。处理延迟加载的对象时出现异常 (LazyInitializationException)。
我在 Quartz 作业中遇到了同样的问题,并且能够通过使用 org.springframework.aop.framework.ProxyFactoryBean 包装我的作业 bean 并提供 org.springframework.orm.hibernate3.HibernateInterceptor 来解决它。我试图用 ProxyFactoryBean 包装我的服务 bean,但收到有关代理不是带注释的 Web 服务的错误。
在这种情况下有没有办法做同样类型的事情,或者在这种情况下管理我的休眠会话的最佳方法是什么?
【问题讨论】:
标签:
hibernate
spring
jax-ws
【解决方案1】:
因此,一种可能的选择是将我的实现分成两个类。一个包含调用数据库持久层的所有业务逻辑,另一个公开 Web 服务并调用业务逻辑。包含业务逻辑的类可以用 Spring 框架 ProxyFactoryBean 包装以利用 HibernateInterceptor。
Java:
public class BusinessLogicClass implements MyInterface {
public void doBusinessLogic() {
//Perform Hibernate stuff here
}
}
@WebService
public class WebServiceClass {
BusinessLogicClass blc;
public setBlc(BusinessLogicClass blc) {
this.blc = blc;
}
@WebMethod
public void doLogic() {
blc.doBusinessLogic()
}
}
Spring XML 配置:
<bean id="transactionalService" class="BusinessLogicClass">
</bean>
<bean id="transactionalServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref bean="transactionalMessageQueueService"/>
</property>
<property name="proxyInterfaces">
<value>MyInterface</value>
</property>
<property name="interceptorNames">
<value>hibernateInterceptor</value>
</property>
</bean>
<bean id="webService" class="WebServiceClass">
<property name="blc">
<ref bean="transactionalServiceProxy"/>
</property>
</bean>
这确实解决了我的问题。虽然对于我的应用程序来说,拥有两个具有基本相同方法的类有点烦人,只是让持久性工作......
-- 更新--
可以启用在基于 Spring XML 文件注释的翻译管理中使用代理配置的替代方法(可能是更好的替代方法),然后 BusinessLogicClass 中需要在事务中的每个方法都可以用 @ 注释987654327@。这是我最终使用的方法。