Эквивалент StickySession в Karaf/OSGI?

Проблема в следующем: в контейнере ma Karaf у меня есть два модуля, первый используется для выборки данных в БД через интерфейс JPA, реализованный Hibernate. Коллекции извлекаются ленивым способом. Второй модуль получает объект, содержащий коллекции. При попытке доступа к элементам коллекции выдается ошибка:

failed to lazily initialize a collection of role:
 mapp3.model.ProductDefinition, could not initialize proxy - no Session

У него нет сеанса для доступа к БД и извлечения недостающих элементов. Я знаю, что в J2EE есть концепция Sticky Session, которая заставляет поток создавать и совместно использовать один и тот же сеанс для всех bean-компонентов.

Есть ли что-то подобное в Karaf/OSGi или есть другой способ правильно выполнить ленивую загрузку между разными модулями?


person Oleg    schedule 18.09.2015    source источник


Ответы (1)


Я только что реализовал аналогичную функцию в Aries JPA 2.1.0. Он использует спецификацию координатора OSGi для совместного использования сеанса EntityManager в потоке. Он работает вместе с планом транзакции Aries 1.3.0, который теперь также использует координацию. Оба доступны в Apache Karaf 4.0.1.

Таким образом, чтобы получить сеанс, который сохраняется в течение нескольких вызовов между bean-компонентами, вы аннотируете самый внешний метод, связанный с @Transactional. Если вам не нужна фактическая транзакция, а только общий EM, вы можете использовать @Transaction с типом Support. Таким образом, начиная с этого метода, все вызовы, сделанные вниз, будут использовать один и тот же em.

Так, например, вы можете сделать что-то вроде этого:

@Transactional
public void myServiceMethod() {
   Person person = personRepo.getPerson();
   List<Task> person.getTask();
}

Таким образом, в приведенном выше примере PersonRepo внедрит EntityManager, используя @PersistenceContext, и будет работать с ним.

MyService.myServiceMethod будет на уровне службы и не должен знать о jpa или EntityManager. По-прежнему используя аннотацию @Transactional, метод будет обеспечивать координацию выполнения метода, содержащего EntityManager.

Также см. мой пример Учебное пособие по Apache Karaf, часть 9. Схема на основе аннотаций и JPA. В примере не показан всеобъемлющий @Transactional, но он должен помочь вам начать работу, если вы хотите вникнуть в него. Как только будущие выпуски Aries будут готовы, я также создам пример, который показывает именно тот случай, который вы ищете.

person Christian Schneider    schedule 18.09.2015