Java JPA EntityManager从其他捆绑包(OSGI)中发现实体
在像Equinox这样的OSGI环境中,我希望有2个bundle(或更多bundle),每个bundle都有自己的JPA注释实体(类)。我希望每个bundle中的类之间有一个依赖关系 例如: 我有绑定1和类Person,绑定2和扩展Person的类Employee(这是我能想到的最简单的示例-我知道我可以在一个绑定中声明这两个类,但我需要它们在单独的绑定中) 是否可以将EntityManager或EntityManagerFactory公开为OSGI服务,该服务了解两个捆绑包中存在的实体?我知道每个bundle都可以有自己的EntityManager(EM),但在给定的示例中,bundle 2中的EM不知道实体Person。如果可能的话,谁能举个例子或建议如何做到这一点 谢谢你的帮助 我希望每个bundle中的类之间有一个依赖关系 这在使用Equinox+OSGI时是不可能的。使用未修改的Equinox和Gemini JPA可以实现的最接近的方法是使用复合持久性单元,但这仍然要求您的实体位于同一捆绑包中,但位于不同的JAR中 我已经用一个修补过的Gemini JPA包创建了一个hack,它可以通过跨包合并持久性上下文来动态创建一个复合peristence上下文,但它非常复杂和挑剔;它依赖于bundle加载顺序,并且不会对bundle重新加载做出正确的反应,因此讨论了OSGi的一半用途Java JPA EntityManager从其他捆绑包(OSGI)中发现实体,java,hibernate,jpa,osgi,osgi-bundle,Java,Hibernate,Jpa,Osgi,Osgi Bundle,在像Equinox这样的OSGI环境中,我希望有2个bundle(或更多bundle),每个bundle都有自己的JPA注释实体(类)。我希望每个bundle中的类之间有一个依赖关系 例如: 我有绑定1和类Person,绑定2和扩展Person的类Employee(这是我能想到的最简单的示例-我知道我可以在一个绑定中声明这两个类,但我需要它们在单独的绑定中) 是否可以将EntityManager或EntityManagerFactory公开为OSGI服务,该服务了解两个捆绑包中存在的实体?我知道
OTOH,您可以公开单独的实体管理器,并在两个捆绑包中使用它们,只要您接受只有其中一个可用的短时间。没有任何东西可以阻止您在Bundle B中跟踪Bundle A的EntityManager(当然,除了循环Bundle依赖项,但是如果您交叉导入包,这种情况就会发生)。为什么这不起作用?如果员工扩展了Person,则捆绑包2将导入包含Person的包。因此它对bundle11有依赖关系。在bundle 2的persistence.xml中,您应该能够列出员工和个人。因此,两者都在bundle 2的Entitymanager中工作。当然,捆绑包1的整体经理无法了解员工。谢谢您的回复。我尝试了Gemini JPA和复合持久性单元,查阅了Hibernate文档,但似乎没有找到解决方案,我想在这里询问是否有人找到了(或者尝试了我需要做的事情)。很难相信这是不可能的……这是困难的,因为一个确实获得传递依赖性,使边缘情况不平凡:考虑的情况下,束A是出口PU B;bundle C需要持久化单元A。如果现在一个新的bundle D具有PU B的扩展,那么C也必须间接依赖于D,否则查询可以返回C无权访问的类。另外,如果一个动态地卸载了D,那么A和C需要刷新…刚刚有了一个顿悟:尝试将D作为一个片段包,与动态配置一起附加到原始包A上;很可能你需要列举你所有的实体…嗯。。。到目前为止我还没试过。我将尝试让您知道结果:)好吧,我已经尝试过了,bundle 2的EntityManager无法识别bundle 1中的实体Person。我可以扩展类Person,因为bundle 2在我将bundle 1添加为依赖项之后就知道了它,所以在运行代码之前不会出现错误。在bundle 2的persistence.xml中,只有员工被称为实体,而persistence.xml是未知实体。您的persistence.xml是什么样子的?