在尝试运行Vogella.de JPA教程时,我不断获得“EntityManager的无持久性提供程序”

时间:2011-08-28 18:27:01

标签: java eclipse jpa

我正试图让http://www.vogella.de/articles/JavaPersistenceAPI/article.html#simple的教程正常工作。它并非如此简单。我知道这对大多数人来说可能是愚蠢的,但我没有任何JPA经验或EJB经验。我的最终目标是在Java桌面类型的应用程序中使用JPA。

当我尝试运行该示例时,我收到此错误:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named todos
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
    at de.vogella.eclipse.ide.main.Main.main(Main.java:17)

我有/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/de/vogella/jpa/simple/model/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项目,但我还没找到一个。我只是找到教程,花了几个小时试图让他们工作,我放弃,继续下一步。是否有一个更好的教程,有一个可下载的项目让我入门?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

实际上,我只是想按照教程进行操作。我遇到了同样的问题。通过将缺少的jar eclipselink.jar添加到类路径中来解决此问题。

此外,如果您使用的是Windows,您似乎正在使用它,则应按以下步骤更新路径定义。

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

答案 2 :(得分:0)

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

  1. 检查META-INF目录的正确位置。
    我的META-INF是项目根目录中的第二个源文件夹,不在源根目录中 我解决了这个问题:
    a)保存persistence.xml文件 b)删除META-INF,因为它是一个单独的源文件夹 c)打开.classpath并删除META-INF作为src的条目 这可以通过以下方式完成:&#34; Projet Explorer&#34;&gt;&#34; YourProject&#34;&gt; [右键单击]&gt;构建路径&gt;配置构建路径 作为替代方案,您可以编辑&#34; YourProject&#34;根目录中隐藏的.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>
    

    我在&#34; MyProject&#34; root中使用/jlib文件夹来托管项目jar文件,因此很容易使用jar文件导出项目,因为这是一个出错的另一个可能原因。
    d)删除后,我在src文件夹中创建了一个文件夹:&#34; Project Explorer&#34; &GT; &#34;您的项目&#34; &GT;在src [右键单击]&gt;新&gt;其他&gt;一般&gt;文件夹&gt;将其命名为:&#34; META-INF&#34;
    e)将存储的persistence.xml文件复制到新的META-INF文件夹中。

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

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

    示例中的原始路径不是您的私人路径! 尝试创建,读取和编写简单的文本文件,以确保您的程序对您的用户帐户具有访问权限,否则请使用您拥有此权限的路径,并通过指定属性的路径来更改值{{1} },然后是&#34; value="jdbc:derby:&#34;。