使用Spring和JAX-WS进行Hibernate会话管理

使用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

我有一个使用Hibernate进行持久化的应用程序,我正在尝试实现一个JAX-WS接口(使用Spring框架公开它)。我还有一个服务类(用
@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>