2010-09-17 27 views
20

Tôi mới sử dụng JPA & Hibernate. Sau khi đọc một số tài liệu trực tuyến, bây giờ tôi đã hiểu Hibernate là gì và nó có thể được sử dụng như thế nào với JPA.javax.persistence.PersistenceException: Không có nhà cung cấp Persistence cho EntityManager có tên customerManager

Bây giờ, tôi đang cố gắng chạy JPA & Hibernate tutorial này. Tôi đã làm tất cả những gì họ đề cập trong hướng dẫn này.

Tôi không có Oracle DB, chỉ có MySQL. Vì vậy, tôi thực hiện một số thay đổi để persistence.xml sử dụng sự hiểu biết của tôi về JPA & Hibernate (Tôi không biết nếu đó là đúng hay không ... Dường như với tôi nó được.)

Đây là 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_1_0.xsd" version="1.0"> 
    <persistence-unit name="customerManager" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>Customer</class> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.connection.username" value="root"/> 
     <property name="hibernate.connection.password" value="1234"/> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/> 
     <property name="hibernate.max_fetch_depth" value="3"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

Nhưng tôi dường như không nhận được kết quả mà họ mô tả. Nó cho tôi:

Customer id before creation:null 
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). 
log4j:WARN Please initialize the log4j system properly. 
Exception in thread "main" javax.persistence.PersistenceException: No Persistence  provider for EntityManager named customerManager 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33) 
at CustomerDAO.create(CustomerDAO.java:8) 
at CustomerDAO.main(CustomerDAO.java:22) 

Mọi đề xuất sẽ được đánh giá cao.

Cập nhật:

tôi đã thực hiện những thay đổi mà chúng tôi khuyến nghị để thực hiện. Nhưng, vẫn nhận được các dòng lỗi asme !!!

Họ không đề cập bất cứ điều gì về orm.xml trong hướng dẫn đó. nó có thể là một vấn đề gây ra !!!

Trả lời

19

persistence.xml của bạn không hợp lệ và không thể tạo EntityManagerFactory. Nó nên là:

<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="customerManager" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>Customer</class> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.connection.username" value="root"/> 
     <property name="hibernate.connection.password" value="1234"/> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/> 
     <property name="hibernate.max_fetch_depth" value="3"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

(Lưu ý cách <property> yếu tố này được đóng cửa, họ không nên được lồng vào nhau)

Cập nhật: tôi đã đi qua các hướng dẫn và bạn cũng sẽ phải thay đổi thế hệ Id chiến lược khi sử dụng MySQL (vì MySQL không hỗ trợ trình tự). Tôi đề nghị sử dụng chiến lược AUTO (mặc định là IDENTITY với MySQL). Để thực hiện việc này, hãy xóa chú thích SequenceGenerator và thay đổi mã như sau:

@Entity 
@Table(name="TAB_CUSTOMER") 
public class Customer implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="CUSTOMER_ID", precision=0) 
    private Long customerId = null; 

    ... 
} 

Điều này sẽ hữu ích.

PS: bạn cũng nên cung cấp log4j.properties như được đề xuất.

+0

Cám ơn bạn câu trả lời. Nhưng nó vẫn đưa ra thông báo lỗi tương tự. Ngoại lệ trong chủ đề "chính" javax.persistence.PersistenceException: Không có nhà cung cấp Persistence cho EntityManager có tên customerManager –

+0

Một lần nữa cảm ơn bạn đã cập nhật. Tôi đã thêm log4j.jar vào thư mục lib như đã nói trong hướng dẫn. Cách để khởi tạo nó là gì? –

+0

@MaRaVan Bạn cần đặt một 'log4j.properties' trên classpath. Hướng dẫn này cung cấp một ví dụ. –

0

Một chút quá muộn nhưng tôi có cùng một vấn đề và cố định nó chuyển schemaLocation vào schemaLocation trong persistence.xml file (dòng 1).

8

Tôi đang đối mặt với cùng một vấn đề. Tôi nhận ra rằng tôi đã sử dụng lớp nhà cung cấp sai trong sự kiên trì.xml

Đối với Hibernate nó phải được

<provider>org.hibernate.ejb.HibernatePersistence</provider> 

Và đối với EclipseLink nó phải được

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
25

chỉ cho đầy đủ. có một tình huống khác gây ra lỗi này: thiếu tệp META-INF/services/javax.persistence.spi.PersistenceProvider. cho hibernate, nó nằm trong hibernate-entitymanager-XXX.jar, vì vậy, nếu hibernate-entitymanager-XXX.jar không có trong classpath của bạn, bạn cũng sẽ gặp lỗi này.

thông báo lỗi này rất gây hiểu lầm và tôi mất đến hàng giờ để sửa nó.

xem this question.

+0

cảm ơn, điều này sẽ giúp bạn! –

+0

rất hữu ích, lỗi này khiến tôi mất một giờ để giải quyết nó. cảm ơn! –

+0

cảm ơn vì điều này! Lạ như thế nào nhiều hướng dẫn bỏ qua thông tin quan trọng này! – NickJ

0

kinh nghiệm của tôi cho tôi biết rằng thiếu persistence.xml, cũng sẽ tạo ra cùng một ngoại lệ.

tôi đã gặp lỗi msg giống như hôm nay khi tôi cố gắng chạy gói jar được đóng gói bởi kiến.

khi tôi sử dụng jar tvf để kiểm tra nội dung của tệp jar, tôi nhận ra rằng "kiến" đã quên đóng gói persistnece.xml cho tôi.

sau khi tôi đóng gói lại tệp jar theo cách thủ công, thông báo lỗi bị từ chối.

vì vậy tôi tin rằng có lẽ bạn nên thử đơn giản đặt META-INF theo thư mục src và đặt persistence.xml của bạn ở đó.

12

Tôi đã có cùng một vấn đề ngay hôm nay. Tệp persistence.xml của tôi nằm sai vị trí. Tôi đã phải đặt nó theo con đường sau:

project/src/main/resources/META-INF/persistence.xml 
+1

Điều đó đã làm điều đó. –

0

Tôi đã thấy lỗi này, đối với tôi vấn đề là có một khoảng trống trong đường dẫn tuyệt đối của persistance.xml, việc loại bỏ tương tự đã giúp tôi.

0

Tôi cũng đang gặp vấn đề tương tự khi tôi cố gắng để có được trình quản lý thực thể JPA được định cấu hình trong Tomcat 8. Đầu tiên tôi gặp vấn đề với lớp SystemException không được tìm thấy và do đó entityManagerFactory không được tạo. Tôi đã loại bỏ sự phụ thuộc của trình quản lý thực thể ngủ đông và sau đó thực thểManManFactory của tôi không thể tìm kiếm nhà cung cấp kiên trì. Sau khi đi qua rất nhiều nghiên cứu và thời gian đã biết rằng quản lý thực thể ngủ đông là phải tìm kiếm một số cấu hình. Sau đó đưa trở lại jar quản lý đối tượng và sau đó thêm JTA Api làm phụ thuộc và nó hoạt động tốt.

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