2010-11-23 79 views
5

我是JPA的新手,我试图从书中做一个简单的例子。 但无论我做什么,我收到以下错误:“没有EntityManager的持久性提供者”错误

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named EmployeeService 
     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89) 
     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60) 
     at com.mycompany.simpleentity.EmployeeTest.main(EmployeeTest.java:18) 

我GOOGLE了很多,我做了所有我读到JPA。
这里是我的项目的目录树:

. 
|-- pom.xml 
`-- src 
    |-- main 
    | |-- java 
    | | `-- com 
    | |  `-- mycompany 
    | |   `-- simpleentity 
    | |    |-- Employee.java 
    | |    |-- EmployeeService.java 
    | |    `-- EmployeeTest.java 
    | `-- resources 
    |  `-- META-INF 
    |   `-- persistence.xml 
    `-- test 

这里是我的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany</groupId> 
    <artifactId>SimpleEntity</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>SimpleEntity</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.persistence</groupId> 
     <artifactId>persistence-api</artifactId> 
     <version>1.0</version>  
    </dependency> 
    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.0-801.jdbc4</version> 
    </dependency> 
    </dependencies> 

    <build> 

     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
      <source>1.5</source> 
      <target>1.5</target> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 

      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>com.mycompany.simpleentity.EmployeeTest</mainClass> 
         <!-- <classpathLayoutType>repository</classpathLayoutType> --> 
         <classpathMavenRepositoryLayout>true</classpathMavenRepositoryLayout> 
         <classpathPrefix>${env.HOME}/.m2/repository</classpathPrefix> 

        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
     </plugins> 

    </build> 
</project> 

这里是我的源代码: EmployeeTest.java:

package com.mycompany.simpleentity; 

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

public class EmployeeTest { 
    public static void main(String[] args) { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeeService"); 
     EntityManager em = emf.createEntityManager(); 

    } 
} 

这里是我的persistance.xml

<persistence 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_1_0.xsd" 
     version="1.0"> 

    <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL"> 
     <class>com.mycompany.simpleentity.Employee</class> 
     <properties> 
      <property name="toplink.jdbc.driver" 
         value="org.postgresql.Driver"/> 
      <property name="toplink.jdbc.url" 
         value="jdbc:postgresql://localhost:5432/testdb;create=true"/> 
      <property name="toplink.jdbc.user" value="postgres"/> 
      <property name="toplink.jdbc.password" value="111"/> 

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

我该怎么做? 预先感谢您。

回答

7

JPA是由多个JPA提供者(Hibernate,EclipseLink,OpenJPA,Toplink)实现的规范。

您需要选择要使用的提供程序并将相应的依赖项添加到您的pom.xml。您还需要在persistence.xml中指定您的提供商。

例如,如果你使用OpenJPA的(我选用它的这个例子,因为它的最新版本是Maven的中央回购可用的,所以没有必要配置特定供应商的仓库):

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- Note that you don't need persistence-api dependency - it's transitive --> 
    <dependency> 
     <groupId>org.apache.openjpa</groupId> 
     <artifactId>openjpa-all</artifactId> 
     <version>2.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.0-801.jdbc4</version> 
    </dependency> 
    </dependencies> 

<persistence 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_1_0.xsd"  
     version="1.0">  

    <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL"> 
     <!-- Provider specification --> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 

     <class>com.mycompany.simpleentity.Employee</class>  
     <properties>  
      <property name="javax.persistence.jdbc.driver"  
         value="org.postgresql.Driver"/>  
      <property name="javax.persistence.jdbc.url"  
         value="jdbc:postgresql://localhost:5432/testdb;create=true"/>  
      <property name="javax.persistence.jdbc.user" value="postgres"/>  
      <property name="javax.persistence.jdbc.password" value="111"/>  

     </properties>  
    </persistence-unit>  
</persistence> 
1

实际上,

您似乎没有实际的Peristence Provider的依赖项。

JPA本身并没有实现,您还需要使用Hibernate/Toplink/OpenJPA作为实际解决方案。

0

根据您的persistence.xml,您将使用TopLink和PostgreSQL作为RDBMS。当您在pom.xml中引用PostgreSQL JDBC驱动程序时,您尚未将TopLink声明为依赖项。

我的猜测(我承认)是持久性API在类路径中找不到TopLink(您的持久性提供程序)。尝试添加TopLink作为依赖项。

2

如果你使用JPA +的EclipseLink提供比使用此代码

<properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/Database name" /> 
      <property name="javax.persistence.jdbc.user" value="" /> 
      <property name="javax.persistence.jdbc.password" value="" /> 
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> 
</properties> 
2

1)请确保您已定义的持久性提供者(不管是什么提供商): 防爆关于OpenJPA: <persistence-unit ...> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> ... ... </persistence-unit>

2)如果你正在使用自定义的编译/编译过程(maven等) 确保你的Meta-INF/persistance.xml被复制到编译/ classes文件夹中。

+0

感谢您提出第二点。这是我的问题。谢谢!!! – nashuald 2013-03-25 14:53:29

0

JPA是一个规范有多个提供者(实现者)。您必须选择一个为JPA规范提供实际字节码的程序。休眠是常见的选择,但你可能会有所不同。一旦你确定了那个,把它作为你的POM的一个依赖。否则,将JAR文件添加到您的构建路径。

相关问题