2011-10-18 38 views
26

我想通過遵循Hibernate EntityManager documentation中的信息來設置一個簡單的jpa 2.0項目。我一直在這幾個小時了,但不管我做什麼,當我嘗試創建一個EntityManagerFactory的我總是得到這樣的例外:使用Hibernate作爲提供者的JPA 2.0 - 例外:沒有EntityManager的持久性提供者

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named manager1 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32) 
    at se.mycomp.UserTest.main(UserTest.java:9) 

我發現相當對此例外幾個類似的問題,但沒有解決方案,我能夠去工作。我在這裏做錯了什麼?

目錄結構

. 
├── pom.xml 
└── src 
    ├── main 
    │   ├── java 
    │   │   └── se 
    │   │    └── mycomp 
    │   │     ├── UserTest.java 
    │   │     └── domain 
    │   │      └── User.java 
    │   └── resources 
    │    ├── META-INF 
    │    │   └── persistence.xml 
    │    └── log4j.properties 
    └── test 
     └── java 

的persistence.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_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <class>se.mycomp.domain.User</class> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> 
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 

      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/test"/> 
      <property name="javax.persistence.jdbc.user" value="test"/> 
      <property name="javax.persistence.jdbc.password" value="1234"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

的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/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<groupId>se.lil.tryjpa</groupId> 
<artifactId>try-jpa</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>jar</packaging> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 

    <hibernate-core.version>3.6.4.Final</hibernate-core.version> 
    <mysql-connector-java.version>5.1.16</mysql-connector-java.version> 
    <slf4j.version>1.6.1</slf4j.version> 
    <log4j.version>1.6.1</log4j.version> 
</properties> 

<dependencies> 
    <!-- HIBERNATE DEPENDENCIES --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>${hibernate-core.version}</version> 
    </dependency> 

    <!-- MYSQL DEPENDENCIES --> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>${mysql-connector-java.version}</version> 
    </dependency> 

    <!-- Logging Dependencies --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>${log4j.version}</version> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
       <optimize>true</optimize> 
       <debug>true</debug> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-eclipse-plugin</artifactId> 
      <version>2.8</version> 
      <configuration> 
       <downloadSources>true</downloadSources> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

UserTest.java

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

回答

45

也許你錯過了Provider類或者在你的pom.xml依賴它的一個依賴?

你給休眠文檔的鏈接說,你還應該添加

<project ...> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>${hibernate-core-version}</version> 
    </dependency> 
    </dependencies> 
</project> 

到你的pom.xml

+4

根本沒有令人尷尬,該錯誤信息是單獨無用的(適用於大量的問題)。 –

+5

我想補充一點,這個依賴關係應該替代'hibernate-core',而不僅僅是一起添加,因爲它實際上已經包含了'hibernate-core'。查看Hibernate [下載頁面]上的Maven依賴關係列表(http://hibernate.org/orm/downloads/)。他們明確地說'對於JPA,使用hibernate-entitymanager而不是hibernate-core'。 – jFrenetic

+0

我沒有使用maven,所以通過添加hibernate-entity-manager.jar(可在hibernate 5.5.2 zip的dist \ lib \ optional \ jpa目錄中找到),然後下載並添加jta-1.1來解決此問題。罐 –

1

的persistence.xml是指存在於META-INF目錄和間INF應該存在於src文件夾的應用程序的類路徑中。

按照您的文件夾結構它存在於資源文件夾中,請嘗試將其移動到類路徑它正在工作。

0

我使用下面的依賴關係,並以下供應商這個問題很好解決:

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 


<dependency> 
    <groupId>org.postgresql</groupId> 
    <artifactId>postgresql</artifactId> 
    <version>9.4-1200-jdbc41</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate.javax.persistence</groupId> 
    <artifactId>hibernate-jpa-2.0-api</artifactId> 
    <version>LATEST</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>LATEST</version> 
</dependency> 

是最新作版本不爲你工作,你可以使用 1.0.1.Final對Hibernate,jpa- 2.0 API 和5.2.5.Final對Hibernate-EntityManager的

此外,在persistence.xml中,不要忘了hbm2dll.auto特性(這是一個問題,我花了一些時間來找出)

<property name="hibernate.hbm2ddl.auto" value="create"/> 
<property name="hibernate.show_sql" value="true"/> 

然後做一個maven乾淨安裝

相關問題