2011-10-18 58 views
26

Tôi đang cố gắng thiết lập một dự án jpa 2.0 đơn giản bằng cách làm theo thông tin trong Hibernate EntityManager documentation. Tôi đã về điều này trong nhiều giờ bây giờ, nhưng không có vấn đề gì tôi làm tôi luôn luôn được ngoại lệ này khi tôi cố gắng để tạo ra một EntityManagerFactory:JPA 2.0 sử dụng Hibernate làm nhà cung cấp - Ngoại lệ: Không có nhà cung cấp Persistence cho 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) 

Tôi đã tìm thấy một vài câu hỏi tương tự liên quan đến ngoại lệ này, nhưng không có giải pháp nào tôi có thể làm việc. Tôi làm gì sai ở đây?

cấu trúc thư mục

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

tôi 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> 

tôi 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(); 
    } 
} 

Trả lời

45

Có lẽ bạn bỏ lỡ lớp cung cấp hoặc một trong các phụ thuộc của nó trong sự phụ thuộc pom.xml của bạn?

Các liên kết mà bạn cung cấp cho các tài liệu ngủ đông nói rằng bạn cũng nên thêm

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

để pom.xml của bạn

+4

Không hề xấu hổ chút nào, thông báo lỗi đó là vô dụng (áp dụng cho toàn bộ vấn đề). –

+5

Tôi muốn thêm rằng sự phụ thuộc này sẽ thay thế phần tử 'hibernate-core', không chỉ được thêm vào bên cạnh, bởi vì nó trong thực tế đã bao gồm' hibernate-core'.Xem danh sách các phụ thuộc Maven trên Hibernate [tải trang] (http://hibernate.org/orm/downloads/). Họ rõ ràng nói rằng 'cho JPA, sử dụng hibernate-entitymanager thay vì hibernate-core'. – jFrenetic

+0

Tôi không sử dụng maven, vì vậy hãy giải quyết vấn đề này bằng cách thêm hibernate-entity-manager.jar (được tìm thấy trong thư mục dist \ lib \ optional \ jpa trong zip hibernate 5.5.2), sau đó tải xuống và thêm jta-1.1. lọ –

1

persistence.xml có nghĩa là để có mặt trong thư mục META-INF và meta- INF có nghĩa là có mặt trong classpath của ứng dụng đó là thư mục src.

Theo cấu trúc thư mục của thư mục hiện tại trong thư mục tài nguyên, hãy thử di chuyển nó sang classpath nó sholud hoạt động.

0

Tôi có vấn đề này được giải quyết bằng cách sử dụng phụ thuộc dưới đây và các nhà cung cấp như sau:

<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> 

là LATEST không hoạt động như phiên bản cho bạn, bạn có thể sử dụng 1.0.1.Final cho hibernate-jpa- 2.0-api và 5.2.5.Final cho hibernate-EntityManager

Ngoài ra, trong persistence.xml, đừng quên tính hbm2dll.auto (điều này là một vấn đề tôi đã dành một chút thời gian để tìm ra)

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

Sau đó, hãy cài đặt sạch maven

Các vấn đề liên quan