Web services SpringWeb服务中的Hibernate会话处理

Web services SpringWeb服务中的Hibernate会话处理,web-services,hibernate,spring,spring-ws,Web Services,Hibernate,Spring,Spring Ws,我正在使用SpringWS和Jaxb2Marshaller、PayloadRootAnnotationMethodEndpointMapping和GenericMarshallingMethodEndpointAdapter,通过@Endpoint和@PayloadRoot注释配置我的web服务 当我尝试使用项目的DAO时,我可以从数据库中加载对象,但当我尝试访问服务中应该延迟加载的属性时,我得到一个org.hibernate.LazyInitializationException-无法初始化代

我正在使用SpringWS和Jaxb2Marshaller、PayloadRootAnnotationMethodEndpointMapping和GenericMarshallingMethodEndpointAdapter,通过@Endpoint和@PayloadRoot注释配置我的web服务

当我尝试使用项目的DAO时,我可以从数据库中加载对象,但当我尝试访问服务中应该延迟加载的属性时,我得到一个org.hibernate.LazyInitializationException-无法初始化代理-没有会话


在我的SpringMVCWeb应用程序中,OpenSessionInviewWinterCeptor处理会话。如何配置web服务项目以自动为每个web服务调用创建Hibernate会话

将org.springframework.aop.framework.ProxyFactoryBean包装在spring上下文中需要存在hibernate会话的对象周围

本文展示了如何做到这一点

如果以这种方式使用会话时由于延迟加载集合而遇到问题,则至少有两种可能的修复方法:

  • 在Hibernate会话可用时执行的代码中,向集合添加Hibernate.initialize()调用-
  • 通过将lazy=“false”添加到映射中来使用非惰性集合-请注意,使用此选项时,您可以很容易地强制hibernate使用几个放置不当的lazy=“false”选项加载整个数据库
      与此同时,我找到了一个解决办法。这个论坛条目给了我一个提示:

      基本上,我将@Transactional注释添加到我的web服务实现类中。棘手的部分是告诉spring使用原始类(不是由tx:annotation-driven创建的代理),这是我通过使用以下配置实现的:

      <bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping" >
          <property name="order" value="1" />
      </bean>
      
      <tx:annotation-driven mode="proxy" order="200" proxy-target-class="true" />
      
      
      

      配置语句的顺序似乎也很重要

      我发现DAO可以工作,但是延迟加载失败了。。。链接中的提示无助于Meaded在我的答案中添加2个可能的修复方法。