相当于Karaf / OSGI中的StickySession?

时间:2015-09-18 14:26:26

标签: java hibernate jpa osgi karaf

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我刚刚在Aries JPA 2.1.0中实现了类似的功能。它使用OSGi Coordinator规范在线程上共享EntityManager会话。它与Aries交易蓝图1.3.0一起使用,现在也使用协调。两者都可以在Apache Karaf 4.0.1中找到。

因此,为了实现在bean之间保持多次调用的会话,您需要注释@Transactional所涉及的最外层方法。如果您不想要实际的事务而只需要共享的EM,那么您可以使用@Transaction类型支持。因此,从这种方法开始,所有向下调用将共享相同的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版本,我还将创建一个示例,准确显示您正在寻找的案例。