JPA EntityManager从其他bundle(OSGI)发现实体

时间:2014-05-07 15:39:48

标签: java hibernate jpa osgi osgi-bundle

在像Equinox这样的OSGI环境中,我希望有2个捆绑包(或更多捆绑包),每个捆绑包都有自己的JPA注释实体(类)。我希望每个包中的类之间存在依赖关系。

例如: 我有类1的捆绑包1和捆绑2的类扩展Person的Employee类(这是我能想到的最简单的例子 - 我知道我可以在一个捆绑包中声明这两个类但我需要它们在单独的捆绑包中)

是否可以将EntityManager或EntityManagerFactory公开为OSGI服务,该服务知道两个包中存在的实体?我知道每个bundle都有自己的EntityManager(EM),但在给定的例子中,bundle 2中的EM不知道实体Person。如果有可能,任何人都可以提供一个例子或sugest如何做到这一点?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

  

我希望每个包中的类之间存在依赖关系。

使用Equinox + OSGI时无法做到这一点。使用未经修改的Equinox和Gemini JPA可以实现的最接近的是使用复合持久性单元,但这仍然要求您的实体位于同一个包中但在单独的JAR中。

我使用修补的Gemini JPA捆绑包创建了一个hack,它可以通过在捆绑包之间合并持久化上下文来动态创建复合持久性上下文,但它非常毛茸茸且挑剔;它依赖于捆绑加载顺序,它不会对捆绑重新加载做出适当的反应,因此有助于实现OSGi的一半......

OTOH,你可以公开单独的实体经理并在两个捆绑包中同时使用它们,只要你接受短时间内只有其中一个可用。没有什么能阻止你在Bundle B中跟踪Bundle A的EntityManager(除了循环bundle依赖,但是如果你交叉导入包,那就会发生这种情况)。

答案 1 :(得分:0)

为什么这不起作用?如果Employee扩展Person,则bundle 2将导入包含Person的包。所以它依赖于bundle1 1.在bundle 2的persistence.xml中,你应该能够列出Employee和Person。因此,两者都在bundle 2的Entitymanager中工作。当然,bundle 1的EntityManager无法了解Employee。