Я только что реализовал аналогичную функцию в 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