Dmi*_*lev 7 postgresql osgi jpa eclipselink
我试图在OSGi中使用JPA并遇到这个异常:
javax.persistence.PersistenceException: No Persistence provider for EntityManager named test
Run Code Online (Sandbox Code Playgroud)
在META-INF中有简单的实体类,文件"persistence.xml":
<?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>
Run Code Online (Sandbox Code Playgroud)
激活:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
并且错误:
org.osgi.framework.BundleException:bundle org.test的org.test.Activator.start()中的异常.在
org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734)
org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)org.eclipse上的org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)位于org.eclipse.osgi.framework的org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1131)的.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:389) .internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559)位于org.eclipse.osgi.framework.internal.core的org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544) .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上的org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1).framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)at or.e.eclipse.osgi.framework.eventmgr.EventManager $ EventThread.run(EventManager.java:340)引起:javax.persistence.PersistenceException:No Persistence provider对于EntityManager在org.eclipse.osgi的org.test.Activator.start(Activator.java:23)的javax.persistence.Persistence.createEntityManagerFactory(未知来源)的javax.persistence.Persistence.createEntityManagerFactory(未知来源)中命名为test.在.org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java)的java.security.AccessController.doPrivileged(Native Method)中的framework.internal.core.BundleContextImpl $ 1.run(BundleContextImpl.java:711): 702)... 12更多根异常: javax.persistence.PersistenceException: 在javax.persistence.Persistence.createEntityManagerFactory(未知来源)的javax.persistence.Persistence.createEntityManagerFactory(未知来源)中没有名为test的EntityManager的持久性提供程序 org.test.Activator.start(Activator.java:23)at org.eclipse.osgi.framework.internal.core.BundleContextImpl $ 1.run(BundleContextImpl.java:711)at java.security.AccessController.doPrivileged(Native Method) )org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)at org. eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)位于org.eclipse.osgi的org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:389). framework.internal.core.Framework.resumeBundle(Framework.java:1131)位于org.eclipse.osgi.framework.internal的org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559). core.StartLevelManager.resumeBundles(StartLevelManager.java:544)位于org.eclipse.osgi.f的org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457)ramework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243)位于org.eclipse.osgi.framework.internal的org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438).在org.eclipse.osgi.framework.eventmgr.EventManager $ EventThread.run的org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)中的core.StartLevelManager.dispatchEvent(StartLevelManager.java:1) EventManager.java:340)
persistence.xml在一个简单的java项目中正常工作,但在OSGi插件中我遇到了这个问题.怎么了?
您需要将persistence.xml路径添加为MANIFEST.MF标头,如下所示:
Meta-Persistence: META-INF/persistence.xml
Run Code Online (Sandbox Code Playgroud)
虽然对于EclipseLink,可能需要以下标头(标头值是逗号分隔的PU名称列表):
JPA-PersistenceUnits: test
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3133 次 |
| 最近记录: |