如何使用 EclipseLink 使 PostgreSQL 与 OSGi 一起工作

Posted

技术标签:

【中文标题】如何使用 EclipseLink 使 PostgreSQL 与 OSGi 一起工作【英文标题】:How to make PostgreSQL work with OSGi using EclipseLink 【发布时间】:2012-03-04 07:06:28 【问题描述】:

我需要用 EclipseLink 开发一个 OSGi 包,它应该连接到 PostgreSQL,但是我浪费了很多时间并且无法让它工作。我收到这个“javax.persistence.PersistenceException: No Persistence provider for EntityManager named rooms”。

基本上,我按照我在网上找到的教程的步骤进行操作。我使用 Eclipse Indigo

Manifest file : 
Manifest-Version: 1.0
Meta-Persistence: persistence.xml
JPA-PersistenceUnits: rooms
Bundle-ClassPath: ., META-INF/persistence.xml
Bundle-ManifestVersion: 2
Bundle-Name: PMSTestTask
Bundle-SymbolicName: PMSTestTask
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: pmstesttask.Activator
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: javax.persistence;version="2.0.3", org.osgi.framework;version="1.3.0", org.postgresql
Require-Bundle: org.eclipse.persistence.jpa;bundle-version="2.1.0", org.eclipse.persistence.jpa.osgi;bundle-version="2.3.0"

persistence.xml

 <?xml version="1.0" encoding="UTF-8" ?>
 <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">

    <persistence-unit name="rooms" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>test_task.domain.Room</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:postgresql://localhost:5432/Hotel_test_task" />
            <property name="javax.persistence.jdbc.user" value="" />
            <property name="javax.persistence.jdbc.password" value="" />

        </properties>
    </persistence-unit>
 </persistence>

Activator.java

 EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("rooms");
 EntityManager em = emf.createEntityManager();

更新。 0

在清单中添加了必需的捆绑包。得到了这个

org.osgi.framework.BundleException: The bundle "org.eclipse.persistence.jpa.osgi_2.3.0.v20110604-r9504 [26]" could not be resolved. Reason: Missing Constraint: Require-Bundle: org.eclipse.persistence.core; bundle-version="2.3.0"

【问题讨论】:

您是否尝试在没有 标签的情况下运行? Provider 应该由 EclipseLink 隐式初始化。 是的,我在没有 的情况下尝试过,但是没有成功 您使用的是什么版本的 Equinox?我知道 Equinox 3.7.0 不适用于 EclipseLink 2.3.x。 尝试新的 org.eclipse.persistence.jpa.osgi.PersistenceProvider.PersistenceProvider().createEntityManagerFactory(PERSISTENCE_UNIT, emptyMap) 而不是 javax.persistence.Persistence.createEntityManagerFactory ...eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/jpa/… 说“JPA在 OSGI 环境中使用的提供程序”...我浪费了几天才找到这段“代码” 【参考方案1】:

由于您自己实例化 EMF(而不是使用例如 Enterprise OSGi 来注入 EMF),因此您必须将 EclipseLink 类添加到包的类路径中,否则 Java 无法实例化指定的 &lt;provider&gt; 类,这可能会导致此错误消息。

参见LazyLoadingRCP 示例,尤其是org.eclipse.persistence.example.jpa.rcp.comics 包的类加载器注释,或该包的具体MANIFEST.MF(EclipseLink 类包含在Require-Bundle 中)。

【讨论】:

谢谢,我已经在 Manifest 中添加了 Require-Bundle,但它没有帮助。我想我以某种方式错误配置了 Eclipse。我在 Eclipse Build Path 中确实有所有必需的 jar,但我收到这样的错误:!ENTRY org.eclipse.persistence.jpa 4 0 2012-02-13 21:10:57.675 !MESSAGE FrameworkEvent ERROR !STACK 0 org.osgi。 framework.BundleException:无法解析捆绑包“org.eclipse.persistence.jpa_2.3.0.v20110604-r9504 [27]”。原因:缺少约束:Require-Bundle:org.eclipse.persistence.core; bundle-version="2.3.0" 错误信息很清楚,无法启动捆绑包 org.eclipse.persistence.jpa,因为它需要捆绑包 org.eclipse.persistence.core,而您的类路径中似乎缺少该捆绑包。跨度> 是的,很明显,但是 persistence.core.jar 也在类路径中

以上是关于如何使用 EclipseLink 使 PostgreSQL 与 OSGi 一起工作的主要内容,如果未能解决你的问题,请参考以下文章

如何配置wildfly以使用EclipseLink?

如何使用 EclipseLink 重新连接丢失的连接?

JPA - EclipseLink - 如何更改默认模式

EclipseLink 如何使用两个@OneToMany 和@ManyToOne 来替换@ManyToMany

Eclipselink:如何在每个捆绑包中获取 EntityManager?

Eclipselink 2.5 使用 Maven 生成元模型