Управление сессиями Hibernate с помощью Spring и JAX-WS - PullRequest
1 голос
/ 18 апреля 2011

У меня есть приложение, которое использует Hibernate для персистентности и пытаюсь реализовать интерфейс JAX-WS (предоставляя его с помощью Spring Framework).У меня также есть класс обслуживания (помеченный @WebService и @WebMethod), который вызывает методы в моем слое постоянства.Я получаю исключения (LazyInitializationException) при работе с лениво загруженными объектами.

Я столкнулся с той же проблемой с заданиями Quartz и смог ее решить, обернув свой рабочий бин org.springframework.aop.framework.ProxyFactoryBean и предоставив org.springframework.orm.hibernate3.HibernateInterceptor.Я попытался обернуть свой служебный бин ProxyFactoryBean, но получил ошибки о том, что прокси-сервер не является аннотированным веб-сервисом.

Есть ли способ сделать то же самое в этом случае, или чтобыть лучшим подходом к управлению моими сеансами гибернации в этом сценарии?

1 Ответ

2 голосов
/ 19 апреля 2011

Итак, похоже, что один из возможных вариантов - разделить мою реализацию на два класса.Один, который будет содержать всю бизнес-логику, которая вызывает уровень персистентности базы данных, и другой, который предоставляет веб-сервис и вызывает бизнес-логику.Класс, содержащий бизнес-логику, может быть обернут в среду 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 Configuration:

<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, который должен был находиться внутри транзакции, можно пометить * 1020.*.Именно такой подход я и использовал в конечном итоге.

...