2011-08-28 55 views
2

时,我总是收到“没有EntityManager的持久性提供者”。我想让教程http://www.vogella.de/articles/JavaPersistenceAPI/article.html#simple工作。它并不那么简单。我知道这对大多数人来说可能很愚蠢,但我没有任何JPA体验或EJB体验。我的最终目标是在Java桌面类型的应用程序中使用JPA。当我试图运行Vogella.de JPA教程

当我尝试运行的例子,我得到这个错误:

​​

我有/src/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<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" 
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
    <persistence-unit name="todos" transaction-type="RESOURCE_LOCAL"> 
     <class>de.vogella.jpa.simple.model.Todo</class> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" /> 
      <property name="javax.persistence.jdbc.url" 
       value="jdbc:derby:/Users/james/Desktop/simpleDb;create=true" /> 
      <property name="javax.persistence.jdbc.user" value="test" /> 
      <property name="javax.persistence.jdbc.password" value="test" /> 

      <!-- EclipseLink should create the database schema automatically --> 
      <property name="eclipselink.ddl-generation" value="create-tables" /> 
      <property name="eclipselink.ddl-generation.output-mode" 
       value="database" /> 
     </properties> 

    </persistence-unit> 
</persistence> 

/jpa_example/src目录/德/ vogella/JPA /简单/模型/ Todo.java

package de.vogella.jpa.simple.model; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

@Entity 
public class Todo { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String summary; 
    private String description; 

    public String getSummary() { 
     return summary; 
    } 

    public void setSummary(String summary) { 
     this.summary = summary; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    @Override 
    public String toString() { 
     return "Todo [summary=" + summary + ", description=" + description 
       + "]"; 
    } 

} 

/jpa_example/src/de/vogella/eclipse/ide/main/Main.java

package de.vogella.eclipse.ide.main; 

import java.util.List; 

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

import de.vogella.jpa.simple.model.Todo; 

public class Main { 
    private static final String PERSISTENCE_UNIT_NAME = "todos"; 
    private static EntityManagerFactory factory; 

    public static void main(String[] args) { 
     factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 
     EntityManager em = factory.createEntityManager(); 
     // Read the existing entries and write to console 
     Query q = em.createQuery("select t from Todo t"); 
     List<Todo> todoList = q.getResultList(); 
     for (Todo todo : todoList) { 
      System.out.println(todo); 
     } 
     System.out.println("Size: " + todoList.size()); 

     // Create new todo 
     em.getTransaction().begin(); 
     Todo todo = new Todo(); 
     todo.setSummary("This is a test"); 
     todo.setDescription("This is a test"); 
     em.persist(todo); 
     em.getTransaction().commit(); 

     em.close(); 
    } 
} 

我一直在试图让任何基本的JPA教程工作。我没有java数据库的经验,我还没有用java开发web应用程序,所以大部分的术语都在我的脑海中。顺便说一句,我真的有兴趣使用JPA与javaSE桌面应用程序,而不是一个Web应用程序。我真的希望我可以下载一个已经在运行的eclipse jpa项目,但我还没有找到一个。我找到几个小时试图让他们工作后的教程,我放弃了,继续前进。有更好的教程,有一个可下载的项目,让我开始?

+1

您是否缺少lib文件夹/构建路径中的eclipselink.jar JAR? –

+0

BalusC,这可能是问题所在。然而由于某种原因,自从我安装EclipseLink之后,其他JPA/webtools的东西我无法再使用项目浏览器了。当我打开它时,只有一个堆栈跟踪与“java.lang.RuntimeException:找不到id:org.eclipse.jst.servlet.ui.EnhancedJavaRendering”。我仍然在刺探自己。如果有更多的时间流逝,我无法修复,我可能会在这里发表一篇文章。只是想知道,如果我使用eclipse classic,我甚至需要使用JPA做非web开发的其他插件吗? – startoftext

+0

@BalusC感谢关于@昵称的提示。我没有意识到在这里工作。我会在这个周末下载java EE,并在有空的时候再试一次。 – startoftext

回答

1

您的persistence.xml中缺少标记,如错误消息所示。添加<class> - 标签与您使用的提供者实现之前,以下行(显示的示例使用OpenJPA实现):

<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
+0

不是强制性的,当然不是造成他错误的那个;如果在CLASSPATH中只有一个JPA实现,那么它将使用指定的持久性单元。 – DataNucleus

0

其实,我只是想按照教程。我遇到了同样的问题。通过将缺少的jar eclipselink.jar添加到类路径中解决了该问题。

此外,如果您使用Windows,似乎您正在使用它,您应该更新您的路径定义如下。

<property name="javax.persistence.jdbc.url" 
     value="jdbc:derby:C:\Users\james\Desktop\simpleDb;create=true" /> 
0

我有同样的错误,我解决了它:

  1. 检查的META-INF目录中的正确位置。
    我的META-INF是项目根目录中的第二个源文件夹,不在源根目录中。
    我通过以下方式解决了这个问题:
    a)保存persistence.xml文件。
    b)删除META-INF,因为它是一个单独的源文件夹。
    三)打开.classpath并删除作为src
    这对于META-INF项可以这样做:“谟资源管理器”>“YourProject”> [点击右键]>构建路径>配置构建路径。
    作为替代方案,您可以在“YourProject”的根
    编辑隐藏.classpath文件的结果应该是这样的:

    <?xml version="1.0" encoding="UTF-8"?> 
        <classpath> 
         <classpathentry kind="src" path="src"/> 
         <classpathentry kind="lib" path="jlib/derby.jar"/> 
         <classpathentry kind="lib" path="jlib/eclipselink.jar"/> 
         <classpathentry kind="lib" path="jlib/javax.persistence_2.1.1.v201509150925.jar"/> 
         <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
         <classpathentry kind="output" path="bin"/> 
        </classpath> 
    

    我在‘MyProject的’使用/jlib文件夹的根,举办项目jar文件,所以很容易导出项目与jar文件,因为这是错误的另一个可能的原因。 d)删除后,我创建了一个文件夹到src文件夹中:“Project Explorer”>“Your Project”>src [右键单击]>新建>其他>常规>文件夹>命名为:“META-INF” e)将存储的persistence.xml文件复制到新的META-INF文件夹中。

  2. 检查所有的路径
    特别是对数据库的路径,在persistence.xml设置:

    <property name="javax.persistence.jdbc.url" 
    value="jdbc:derby:**/home/yourHome**/DerbyDBBasics/ToDoDb;create=true" /> 
    

    从样本的原始路径是不是你的私人路径! 尝试创建,读取和写入简单的文本文件,以确保您的程序具有您的用户帐户的访问权限,否则使用您拥有此权限的路径,并通过将路径指定给属性value="jdbc:derby:来更改值,之后是“;create=true"”。

相关问题