2013-03-04 37 views
1

我已经创建了小OSGI buldle项目与JPA2.0支持,坚持学生(实体类)对象。与JPA支持OSGI bunfle没有持久性提供程序错误

我将能够成功启动此服务。

我已经创造了另一个客户端包项目访问此服务。当我尝试启动客户端buldle服务我流汗波纹错误

产生的原因:javax.persistence.PersistenceException:否EntityManager的持久性提供者名为StudentJPAService

请找到完整的堆栈跟踪波纹管

!ENTRY StudentJPAClient 4 0 2013-03-04 14:17:21.846 
!MESSAGE FrameworkEvent ERROR 
!STACK 0 
org.osgi.framework.BundleException: Exception in student.jpaclient.Activator.start() of bundle StudentJPAClient. 
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734) 
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) 
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) 
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390) 
    at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1176) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1) 
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) 
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340) 
Caused by: java.lang.ExceptionInInitializerError 
    at com.student.jpaservice.serviceimpl.StudentDAOService.persist(StudentDAOService.java:16) 
    at student.jpaclient.Activator.start(Activator.java:30) 
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) 
    ... 12 more 
Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named StudentJPAService 
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) 
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) 
    at com.student.jpaservice.util.StudentUtil.<clinit>(StudentUtil.java:11) 
    ... 17 more 
Root exception: 
java.lang.ExceptionInInitializerError 
    at com.student.jpaservice.serviceimpl.StudentDAOService.persist(StudentDAOService.java:16) 
    at student.jpaclient.Activator.start(Activator.java:30) 
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at 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) 
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390) 
    at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1176) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438) 
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1) 
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) 
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340) 
Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named StudentJPAService 
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) 
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) 
    at com.student.jpaservice.util.StudentUtil.<clinit>(StudentUtil.java:11) 
    ... 17 more 

MANIFEST.MF

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: StudentJPAService 
Bundle-SymbolicName: StudentJPAService;singleton:=true 
Bundle-Version: 1.0.0.qualifier 
Bundle-Activator: com.student.jpaservice.actovator.Activator 
Import-Package: javax.persistence;version="1.1.0", 
org.osgi.framework 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
Export-Package: com.student.jpaservice.actovator, 
com.student.jpaservice.model, 
com.student.jpaservice.service, 
com.student.jpaservice.serviceimpl, 
com.student.jpaservice.util 
Bundle-ActivationPolicy: lazy 
Meta-Persistence: META-INF/persistence.xml 
Bundle-ClassPath: ../lib/j2ee.jar, 
../lib/javax.j2ee.persistence.jar, 
../lib/mysql-connector-java-5.1.7-bin.jar, 
. 
JPA-PersistenceUnits: StudentJPAService 

我可以在下面的文章中看到同样的问题,但它并没有帮助我解决我的问题。
OSGi + JPA(postgresql)

请帮我解决这个问题。

回答

0

看来,在你的包,你还没有定义的任何持久性管理器,如Hibernate,Eclipse的链接,无论...

检查你的依赖关系树,在你的导入包中只定义了两个包,osgi核心和JPA,但JPA只是一个规范(接口),您需要一个实现这些接口的引擎。

+0

感谢您的帮助。你有什么想法,我们可以使用这些接口的引擎? – 2013-03-04 11:04:00

+0

是的,有几个ORM实现JPA。一些例子是:Hibernate,EclipseLink,TopLink或OpenJPA。我认为最受欢迎的是Hibernate和EclipseLink。 Hibernate是最流行,功能强大且灵活的ORM,但它也是最重的,也是最难学的。另一方面EclipseLink是一个轻量级的ORM,但它不像休眠那样强大。 – 2013-03-04 11:24:24

+0

你可以看看下一期:http://stackoverflow.com/questions/2569522/hibernate-or-eclipselink – 2013-03-04 11:30:23

1

我建议用两种OpenJPA的或的EclipseLink一起使用JPA白羊座作为持久性提供。目前我会推荐OpenJPA,因为Eclipselink支持仍然非常新鲜。

对于一个完整的例子,你可以看到我的Apache Karaf DB tutorial。它包含一个jpa示例。

0

我意识到这无异于螺纹巫术,但我同样的问题挣扎了一段时间,直到我自己我偶然发现绕过持久性提供者查找批发的解决方案。

使用此代码...

EntityManagerFactory emf = new org.eclipse.persistence.jpa.PersistenceProvider().createEntityManagerFactory("unit_name_here", properties); 
    EntityManager manager = emf.createEntityManager(); 

...我直接调用的EclipseLink而忽略了整个服务提供者查找。我意识到这并不是超级可移植的,因为您不能在不重新编译模块的情况下交换持久性提供程序,但我也不记得上次我想要这样做。

希望这有助于有人在未来的日子节省了他们和头发半拉着我的经历!

相关问题