OSGi JPA(postgresql)

#postgresql #jpa #osgi #eclipselink

#postgresql #jpa #osgi #eclipselink

Вопрос:

Я попытался использовать JPA в OSGi и столкнулся с этим исключением:

  javax.persistence.PersistenceException: No Persistence provider for EntityManager named test 
 

Есть простой класс сущностей, файл «persistence.xml » в META-INF:

 <?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/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">
  <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>org.test.Room</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>
      <property name="javax.persistence.jdbc.password" value="12345"/>
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
      <property name="javax.persistence.jdbc.user" value="postgres"/>

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

Активатор:

 package org.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

    private static BundleContext context;
    static BundleContext getContext() {
        return context;
    }

    public void start(BundleContext bundleContext) throws Exception {
        Activator.context = bundleContext;
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
    }

    public void stop(BundleContext bundleContext) throws Exception {
        Activator.context = null;
    }
}
 

Manifest.mf:

 Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test
Bundle-SymbolicName: org.test
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: org.test.Activator
Import-Package: javax.persistence;version="2.0.3", 
 org.osgi.framework;version="1.3.0",
 org.postgresql;version="8.3.604"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 

И ошибка:

org.osgi.framework.Исключение BundleException: исключение в org.test.Activator.start() пакета org.test. at

org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734)

в org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) в org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) в org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:389) в org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java: 1131) в org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559) в org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544) в org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457) в org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243) в org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438) в org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1) в org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) в организации. eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340), вызванный: javax.persistence.PersistenceException: нет поставщика сохраняемости для EntityManager с именем test в javax.persistence.Persistence.createEntityManagerFactory(неизвестный источник) в javax.persistence.Persistence.createEntityManagerFactory(неизвестный источник) в org.test.Activator.start(Activator.java:23) в org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.запустите (BundleContextImpl.java:711) в java.security.Контроллер доступа.doPrivileged(собственный метод) в org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) … еще 12 корневых исключений: javax.persistence.PersistenceException: нет поставщика сохраняемости для EntityManager с именем test в javax.постоянство.Persistence.createEntityManagerFactory(неизвестный источник) в javax.persistence.Persistence.createEntityManagerFactory(неизвестный источник) в org.test.Activator.start(Activator.java:23) в org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.запустите (BundleContextImpl.java:711) в java.security.Контроллер доступа.Допривилегирован (собственный метод) в org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) в org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) в org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) в org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:389) в org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java: 1131) в org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559) в org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544) в org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457) в org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243) в org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438) в org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1) в org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) в org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)

persistence.xml is корректно работает в простом java-проекте, но в плагине OSGi у меня есть эта проблема. Что случилось?

Комментарии:

1. Не удается увидеть импорт классов поставщика сохраняемости, которые вы упомянули в persistence.xml разделе Try DynamicImport-Package: org.eclipse.*, .... в своем манифесте

2. спасибо за ответ, но у меня все еще есть эта ошибка

Ответ №1:

Вам нужно добавить persistence.xml путь в качестве заголовка MANIFEST.MF, например, так:

 Meta-Persistence: META-INF/persistence.xml
 

Хотя для EclipseLink может потребоваться следующий заголовок (значение заголовка — список имен PU, разделенных запятыми):

 JPA-PersistenceUnits: test
 

Комментарии:

1. Хороший материал =) OSGi довольно хорошо определен, в спецификации enterprise есть довольно много информации о JPA osgi.org/Specifications/HomePage что вы можете счесть полезным