Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA EntityManager从其他捆绑包(OSGI)中发现实体_Java_Hibernate_Jpa_Osgi_Osgi Bundle - Fatal编程技术网

Java JPA EntityManager从其他捆绑包(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服务,该服务了解两个捆绑包中存在的实体?我知道

在像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的一半用途


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是什么样子的?