使用Spring和JAX-WS进行Hibernate会话管理
我有一个使用Hibernate进行持久化的应用程序,我正在尝试实现一个JAX-WS接口(使用Spring框架公开它)。我还有一个服务类(用使用Spring和JAX-WS进行Hibernate会话管理,hibernate,spring,jax-ws,Hibernate,Spring,Jax Ws,我有一个使用Hibernate进行持久化的应用程序,我正在尝试实现一个JAX-WS接口(使用Spring框架公开它)。我还有一个服务类(用@WebService和@WebMethod注释),它调用持久层中的方法。在处理惰性加载的对象时,我会遇到异常(LazyInitializationException) 我在Quartz作业中遇到了同样的问题,通过使用org.springframework.aop.framework.ProxyFactoryBean包装我的作业bean并提供org.sprin
@WebService
和@WebMethod
注释),它调用持久层中的方法。在处理惰性加载的对象时,我会遇到异常(LazyInitializationException
)
我在Quartz作业中遇到了同样的问题,通过使用org.springframework.aop.framework.ProxyFactoryBean
包装我的作业bean并提供org.springframework.orm.hibernate3.HibernateInterceptor
解决了这个问题。我试图用ProxyFactoryBean
包装我的服务bean,但收到了关于代理不是带注释的web服务的错误
在这种情况下,有没有办法做同样的事情,或者在这种情况下,管理hibernate会话的最佳方法是什么?因此,一个可能的选择是将我的实现分成两个类。一个包含调用数据库持久层的所有业务逻辑,另一个公开web服务并调用业务逻辑。包含业务逻辑的类可以用Spring框架
ProxyFactoryBean
包装,以利用HibernateInterceptor
爪哇:
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>
MyInterface
冬眠受体
这确实解决了我的问题。虽然对于我的应用程序来说,有两个方法基本相同的类是有点麻烦的,但只要让持久性工作就可以了
--更新--
作为在基于Spring XML文件注释的翻译管理中使用代理配置的替代方案(可能是更好的替代方案),可以启用,
BusinessLogicClass
中需要在事务中使用的每个方法都可以使用@Transactional
进行注释。这是我最终使用的方法。[spring-ws]
标记被删除,因为它指的是一个完全不同的框架(),而不是JAX-ws。
@WebService
public class WebServiceClass {
BusinessLogicClass blc;
public setBlc(BusinessLogicClass blc) {
this.blc = blc;
}
@WebMethod
public void doLogic() {
blc.doBusinessLogic()
}
}
<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>