相当于 Karaf/OSGI 中的 StickySession?

An equivalent to StickySession in Karaf/OSGI?

问题如下:在 ma Karaf 容器中,我有两个模块,第一个用于通过 Hibernate 实现的 JPA 接口获取数据库中的数据。以惰性方式获取集合。 第二个模块获取包含集合的对象。尝试访问集合的元素时,抛出错误:

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

它没有访问数据库和获取缺失元素的会话。 我知道在 J2EE 中有一个 Sticky Session 的概念,它使线程创建并在所有 bean 之间共享相同的会话。

Karaf/OSGi 中是否有类似的东西,或者是否有另一种方法可以正确实现不同模块之间的延迟加载?

我刚刚在 Aries JPA 2.1.0 中实现了类似的功能。它使用 OSGi Coordinator 规范在线程上共享 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 将使用 @PersistenceContext 注入 EntityManager 并使用它。

MyService.myServiceMethod 将在服务层上,不应该知道 jpa 或 EntityManager。仍然使用 @Transactional annoation 该方法将在执行持有 EntityManager 的方法时提供协调。

另见我的例子Apache Karaf Tutorial Part 9 - Annotation based blueprint and JPA。该示例没有显示包罗万象的@Transactional,但如果您想深入了解它,应该可以让您轻松入门。一旦即将发布的 Aries 版本完成,我还将创建一个示例来准确显示您正在寻找的案例。