Как заставить PostgreSQL работать с OSGi, используя EclipseLink - PullRequest
4 голосов
/ 12 февраля 2012

Мне нужно разработать пакет OSGi с EclipseLink, который должен подключаться к PostgreSQL, но я потратил кучу времени и не смог заставить его работать.Я получаю это «исключение javax.persistence.PersistenceException: Отсутствует поставщик сохраняемости для именованных номеров EntityManager».

По сути, я следовал инструкциям, найденным в Интернете.Я использую 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"

1 Ответ

1 голос
/ 13 февраля 2012

Поскольку вы создаете экземпляр EMF самостоятельно (а не используете, например, Enterprise OSGi для введения EMF), вам необходимо добавить классы EclipseLink в путь к классам пакета, в противном случае Java не сможет создать экземпляр указанного класса <provider>, который может привести к этому сообщению об ошибке.

См. Пример LazyLoadingRCP , особенно примечания загрузчика классов для пакета org.eclipse.persistence.example.jpa.rcp.comics или конкретные MANIFEST.MF этого пакета (классы EclipseLink включены в Require-Bundle ).

...