启动服务时出现Jpa-hibernate错误

以下是我在启动服务后看到的日志中的错误…您能否帮助解决此问题。

2013-08-22 10:35:37,111 | DEBUG | l Console Thread | AbstractServiceReferenceRecipe | r.AbstractServiceReferenceRecipe 143 | 7 - org.apache.aries.blueprint.core - 1.1.0 | Found initial references null for OSGi service (&(&(org.apache.aries.jpa.proxy.factory=true)(osgi.unit.name=tenant))(objectClass=javax.persistence.EntityManagerFactory)) 2013-08-22 10:35:37,111 | DEBUG | l Console Thread | BlueprintContainerImpl | container.BlueprintContainerImpl 280 | 7 - org.apache.aries.blueprint.core - 1.1.0 | Running blueprint container for bundle com.igt.arcus.framework.jta.arcus-framework-feature-service in state WaitForInitialReferences 2013-08-22 10:35:37,111 | INFO | l Console Thread | BlueprintContainerImpl | container.BlueprintContainerImpl 344 | 7 - org.apache.aries.blueprint.core - 1.1.0 | Bundle com.igt.arcus.framework.jta.arcus-framework-feature-service is waiting for dependencies [(&(&(org.apache.aries.jpa.proxy.factory=true)(osgi.unit.name=tenant))(objectClass=javax.persistence.EntityManagerFactory))] 2013-08-22 10:35:37,112 | DEBUG | l Console Thread | BlueprintEventDispatcher | ntainer.BlueprintEventDispatcher 136 | 7 - org.apache.aries.blueprint.core - 1.1.0 | Sending blueprint container event BlueprintEvent[type=GRACE_PERIOD, dependencies=[(&(&(org.apache.aries.jpa.proxy.factory=true)(osgi.unit.name=tenant))(objectClass=javax.persistence.EntityManagerFactory))]] for bundle com.igt.arcus.framework.jta.arcus-framework-feature-service 

如果您使用Aries JPA,您应该看到两个EntityManagerFactory服务:

  • jpa-container使用persistence.xml获取您的包,并创建一个Entity manager工厂
  • jpa-container-context选取每个EntityManagerFactory服务,并使用(org.apache.aries.jpa.proxy.factory = true)服务属性键值对创建新的托管EntityManagerFactory服务

第二个在您的环境中不存在。 可能有两个原因:

  • aries-jpa-container-context不在您的OSGi环境中,或者它不处于ACTIVE状态
  • 原始的EntityManagerFactory服务未注册,因为缺少某些依赖项

如果您打开OSGi控制台并检查可用的服务,则可以检查它。 如果根本没有EntityManagerFactory服务,那么第二个就是你的问题。

检查所有捆绑包是否都处于活动状态! 如果是,请检查您是否拥有jpa-container所需的所有服务:TransactionManager,DataSource或DataSourceFactory以及用于Hibernate的javax.persistence.spi.PersistenceProvider服务。 如果缺少任何服务aries-jpa-container将获取您的包但永远不会创建EntityManagerFactory。

我实现了一个自己的jpa容器,其工作方式与aries-jpa-container几乎相同。 如果你替换aries-jpa-container(只有那个,jpa-container-context应该留在那里),它会在INFO级别记录更多消息,为你丢失。 容器可在这里找到 。 有一个使用hibernate的示例应用程序可以在https://github.com/everit-org/osgi-hibernate上找到 。 运行“mvn install”后,你会发现itests / core / target / eosgi-itests-dist / equinox是一个子文件夹,你可以在equinox服务器上用bin / runco​​nsole.sh启动工作应用程序。

当前的aries jpa容器jar 1.0.0有一个错误,它使得它在创建EntityManager时吞下exception。 我的一位同事揭开了白羊座的错误: https ://issues.apache.org/jira/browse/ARIES-1160

我创建了第二个补丁,可以应用于1.0.0源代码来创建一个正确记录exception的jar。 查看aries jpa容器的1.0.0标签,应用补丁并构建。

当你在karaf中运行时,你应该看到错误的真正来源。