Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Jpa 在OSGi环境中,类路径和类装入器是如何设置的?_Jpa_Osgi_Classloader_Eclipselink_Apache Felix - Fatal编程技术网

Jpa 在OSGi环境中,类路径和类装入器是如何设置的?

Jpa 在OSGi环境中,类路径和类装入器是如何设置的?,jpa,osgi,classloader,eclipselink,apache-felix,Jpa,Osgi,Classloader,Eclipselink,Apache Felix,我对OSGi中的类可见性感到困惑。我正在运行ApacheFelix并加载以下捆绑包: eclipselink的antlr、asm、jpa和core捆绑包 用于javax.persistence1.99的OSGi化jar 带有com.mysql.jdbc驱动程序的OSGi化jar 我自己的一个包,包含带注释的实体类和一个persistence.xml 我自己的另一个包调用了Persistence.createEntityManagerFactory(String,Map) 现在,我感到困惑的是

我对OSGi中的类可见性感到困惑。我正在运行ApacheFelix并加载以下捆绑包:

  • eclipselink的
    antlr
    asm
    jpa
    core
    捆绑包
  • 用于
    javax.persistence
    1.99的OSGi化jar
  • 带有
    com.mysql.jdbc
    驱动程序的OSGi化jar
  • 我自己的一个包,包含带注释的实体类和一个
    persistence.xml
  • 我自己的另一个包调用了
    Persistence.createEntityManagerFactory(String,Map)
现在,我感到困惑的是哪个包必须能够看到MySQL驱动程序。我原以为这将是创建EntityManagerFactory的捆绑包,但在导入该清单时,我发现ClassNotFound错误。接下来,我尝试从eclipselink
jpa
bundle的清单中导入它,但再次出错。只有当我从包含持久性单元的包(实体类和
persistence.xml
)的清单中导入它时,它才能工作

因此,clasloader似乎在查找数据库驱动程序以查找PU包,但这对我来说没有意义。发生什么事了


我似乎找不到这方面的直接文档。给出一些提示,但并不全面。

我对Hibernate和JDBC的OSGi类路径问题很熟悉,我可以根据您链接的幻灯片向您说明我的推理

我假设您已经将JDBC驱动程序条目添加到PU包中的
persistence.xml

EclipseLink使用该模式代表PU包进行工作。扩展器正在侦听捆绑包,检查它们是否有persistence.xml,然后执行设置工作。它期望PU包导入persistence.xml中可能引用的所有类型,包括JDBC驱动程序

想想看。EclipseLink捆绑包不会导入所有已知的JDBC驱动程序(也不应该如此)——只有您的捆绑包才能知道它们需要哪个数据库驱动程序,因此,期望您的PU捆绑包导入JDBC驱动程序类是合理的


如果第三方库已经OSGi化了,比如EclipseLink,那么您不需要修改它们的清单。

我发现这个pdf对于类加载非常有用:

我将驱动程序作为属性传递给createEntityManagerFactory,但我想这是一样的?不知怎么的,我觉得这很奇怪。难道不应该是持久性提供程序来处理所有特定于db的东西吗?持久性提供程序只需要一个能够处理JDBC接口的db驱动程序。这样可以保持束之间的耦合较低。选择使用哪个数据库是特定于应用程序的,因此它应该是代码/配置的一部分。这是OSGi的基本模式:接口用作契约,一些捆绑包提供特定于域或应用程序的实现。