2015-11-11 51 views
0

還有一個。 3.5小時後,我轉向使用stackoverflow來查看是否有人可以找出發生此錯誤的原因。帶JPA的嵌入式Derby:沒有EntityManager的持久性提供者命名爲

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

完整的例外回溯如下

javax.persistence.PersistenceException: No Persistence provider for EntityManager named derby 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 
    at mmis.mars.irs.mec.batch.DerbyTest.setup(DerbyTest.java:26) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

以下罐子被引用。這些是JPA,eclipselink,德比和derbyclient。我不認爲需要使用derbyclient,但是我通過eclipselink在另一篇關於嵌入式德比的文章中加入了它。

  • javax.persistence_2.1.0.v201304241213.jar
  • eclipselink.jar
  • 的derby.jar
  • derbyclient.jar中

下面是persistence.xml文件。它放置在項目根目錄下的META-INF文件夾中。 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="derby" transaction-type="RESOURCE_LOCAL"> 
      <class>JPA_class1</class> 
      <class>JPA_class2</class> 
      <class>JPA_class3</class> 
      <class>JPA_class4</class> 

      <properties> 
       <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" /> 
       <property name="javax.persistence.jdbc.url" value="jdbc:derby:thedb;create=true" /> 
      </properties> 
     </persistence-unit> 
    </persistence> 

META-INF列入

  • 包括:(所有)
  • 排除:(無)
  • 本機庫的位置:(無)
  • 忽略可選編譯問題:(無)

根據其他帖子,提供者標記不是必需的d。

我試圖在正確的位置包括每個提供者標籤。都沒有工作。

<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 

以下是我嘗試使用提供者標記的內容。

<persistence-unit name="derby" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 

    <class>...</class> 

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

<persistence-unit name="derby" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 

    <class>...</class> 

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

我目前運行它JUnit測試中的「測試」文件夾,這是在根目錄下,並且還包括作爲源文件夾中。 JUnit測試失敗,出現以下錯誤。

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

以下是導致錯誤的代碼行。

Persistence.createEntityManagerFactory("derby").createEntityManager(); 
+0

您肯定不需要derbyclient.jar,因爲您使用的是Derby EmbeddedDriver和Derby嵌入式JDBC連接URL語法。你能提供完整的異常回溯,而不僅僅是一行摘要嗎? –

+0

我已經添加了完整的回溯。謝謝^ _ ^。 – nestharus

+0

你有沒有在你的'persistence-unit'中顯式指定'provider'標記?我不確定什麼「其他職位」告訴你,這不是必需的。我看到的唯一的東西是http://docs.oracle.com/cd/E26576_01/doc.312/e24930/jpa.htm#GSDVG00138,其中說明了您必須符合以省略「提供者」標籤的其他前提條件。 –

回答

0

嘗試驗證JPA persistence.xml文件是否已命名並位於項目文件夾中的「src/META-INF/persistence.xml」中。由於路徑文件名或persistence.xml文件的路徑名不正確,JPA可能找不到持久單元。

相關問題