我正试图让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项目,但我还没找到一个。我只是找到教程,花了几个小时试图让他们工作,我放弃,继续下一步。是否有一个更好的教程,有一个可下载的项目让我入门?
答案 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)
我有同样的错误,我解决了它:
检查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文件夹中。
检查所有路径
特别是数据库的路径,在persistence.xml
:
<property name="javax.persistence.jdbc.url"
value="jdbc:derby:**/home/yourHome**/DerbyDBBasics/ToDoDb;create=true" />
示例中的原始路径不是您的私人路径!
尝试创建,读取和编写简单的文本文件,以确保您的程序对您的用户帐户具有访问权限,否则请使用您拥有此权限的路径,并通过指定属性的路径来更改值{{1} },然后是&#34; value="jdbc:derby:
&#34;。