2010-09-17 14 views
20

मैं जेपीए & हाइबरनेट के लिए नया हूं। कुछ ऑनलाइन सामग्रियों को पढ़ने के बाद अब मैं समझता हूं कि हाइबरनेट क्या है और इसका उपयोग जेपीए के साथ कैसे किया जा सकता है।javax.persistence.PersistenceException: EntityManager के लिए कोई दृढ़ता प्रदाता ग्राहक नामक

अब, मैं यह JPA & Hibernate tutorial चलाने की कोशिश कर रहा हूं। मैंने इस ट्यूटोरियल में जो कुछ भी उल्लेख किया है, मैंने किया है।

मेरे पास ओरेकल डीबी, केवल MySQL नहीं है। इसलिए मैं जेपीए & हाइबरनेट की मेरी समझ का उपयोग कर persistence.xml लिए कुछ परिवर्तन किए (मैं अगर यह सही है या नहीं पता नहीं है ... मेरे लिए यह है लगता है।)

यहाँ मेरी 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> 

है लेकिन मुझे लगता है कि वे उत्पादन का उत्पादन नहीं कर रहे हैं। यह मुझे दे रहा है:

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) 

किसी भी सुझाव की सराहना की जाएगी।

अद्यतन:

मैं परिवर्तन किया के लिए कहा जाता बना दिया है। लेकिन, अभी भी एएसएम त्रुटि लाइनें हो रही है !!!

उन्होंने उस ट्यूटोरियल में orm.xml के बारे में कुछ भी नहीं बताया। यह एक समस्या कारण हो सकता है !!!

उत्तर

19

आपका persistence.xml मान्य नहीं है और EntityManagerFactory नहीं बनाया जा सकता है। यह होना चाहिए:

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

(ध्यान दें कि कैसे <property> तत्वों बंद हो जाती हैं, वे नेस्ट नहीं किया जाना चाहिए)

अद्यतन: मैं ट्यूटोरियल के माध्यम से चला गया और आप भी Id पीढ़ी को बदलने के लिए होगा MySQL का उपयोग करते समय रणनीति (जैसे MySQL अनुक्रमों का समर्थन नहीं करता है)। मैं AUTO रणनीति (MySQL के साथ पहचान के लिए डिफ़ॉल्ट) का उपयोग करने का सुझाव देता हूं। ऐसा करने के लिए, SequenceGenerator टिप्पणी निकालने और इस तरह कोड बदलने के लिए:

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

    ... 
} 

यह मदद करनी चाहिए।

पीएस: आपको सुझाए गए अनुसार log4j.properties भी प्रदान करना चाहिए।

+0

के लिए धन्यवाद अनुसार अपने persistence.xml

में

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

में बदल जानी चाहिए अपने जवाब। लेकिन यह अभी भी एक ही त्रुटि संदेश दे रहा है। थ्रेड "अप" में अपवाद "मुख्य" javax.persistence.PersistenceException: EntityManager के लिए कोई दृढ़ता प्रदाता ग्राहक नामक –

+0

फिर से आपके अपडेट के लिए धन्यवाद। मैंने ट्यूटोरियल में लॉग 4j.jar को lib फ़ोल्डर में जोड़ा क्योंकि उन्होंने ट्यूटोरियल में कहा था। इसे शुरू करने का तरीका क्या है? –

+0

@MaRaVan आपको 'log4j' डालना होगा।क्लासपाथ पर गुण '। ट्यूटोरियल एक उदाहरण प्रदान करता है। –

0

थोड़ा बहुत देर हो चुकी है, लेकिन मैं एक ही मुद्दा मिल गया है और यह schemaLocation में schemalocation स्विचिंग persistence.xml फ़ाइल (लाइन 1) में ठीक किया गया।

8

मुझे एक ही समस्या का सामना करना पड़ रहा था। मुझे एहसास हुआ कि मैं दृढ़ता से गलत प्रदाता कक्षा का उपयोग कर रहा था।एक्सएमएल

हाइबरनेट के लिए यह होना चाहिए

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

और EclipseLink के लिए यह

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
25
सिर्फ पूर्णता के लिए

होना चाहिए। इस त्रुटि के कारण एक और स्थिति है: मेटा-आईएनएफ/सेवाएं/javax.persistence.spi.PersistenceProvider फ़ाइल गायब है। हाइबरनेट के लिए, यह हाइबरनेट-इकाई प्रबंधक-XXX.jar में स्थित है, इसलिए, यदि हाइबरनेट-इकाई प्रबंधक-XXX.jar आपके क्लासपाथ में नहीं है, तो आपको यह त्रुटि भी मिल जाएगी।

यह त्रुटि संदेश इतना भ्रामक है, और इसे सही करने के लिए मुझे घंटे लगते हैं।

this question देखें।

+0

धन्यवाद, यह मदद करता है! –

+0

बहुत उपयोगी, इस त्रुटि ने मुझे हल करने के लिए एक घंटे की तरह खर्च किया। धन्यवाद! –

+0

इसके लिए धन्यवाद! अजीब कितने ट्यूटोरियल इस महत्वपूर्ण जानकारी को छोड़ दें! – NickJ

0

मेरा अनुभव मुझे बताता है कि लापता persistence.xml, एक ही अपवाद उत्पन्न करेगा।

मैंने उसी त्रुटि संदेश को आज पकड़ा जब मैंने चींटी द्वारा पैक किए गए एक जार पैकेज को चलाने की कोशिश की।

जब मैंने जार फ़ाइल की सामग्री की जांच करने के लिए जार टीवीएफ का उपयोग किया, तो मुझे एहसास हुआ कि "चींटी" मेरे लिए persistnece.xml पैक करने के लिए भूल गई।

मैन्युअल रूप से जार फ़ाइल को पुनर्स्थापित करने के बाद, त्रुटि संदेश गायब हो गया।

तो मुझे विश्वास है कि आपको शायद मेटा-आईएनएफ को src निर्देशिका के अंतर्गत डालने और अपने persistence.xml को रखने की कोशिश करनी चाहिए।

12

मुझे आज भी यही समस्या थी। मेरा persistence.xml गलत स्थान पर था। मैं निम्नलिखित पथ में रख किया था:

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

यह चाल है। –

0

मैं यह त्रुटि, मेरे लिए मुद्दा persistance.xml के निरपेक्ष रास्ते में एक जगह नहीं था देखा है, एक ही को हटाने मुझे मदद की।

0

मुझे उसी समस्या का सामना करना पड़ रहा था जब मैं जेएमए इकाई प्रबंधक को टॉमकैट 8 में कॉन्फ़िगर करने का प्रयास कर रहा था। सबसे पहले मुझे सिस्टम अपवाद वर्ग के साथ कोई समस्या नहीं मिली है और इसलिए इकाई प्रबंधक फैक्टरी नहीं बनाई जा रही थी। मैंने हाइबरनेट इकाई प्रबंधक निर्भरता को हटा दिया और फिर मेरी इकाई मैनेजर फैक्टरी दृढ़ता प्रदाता के लिए खोज करने में सक्षम नहीं थी। बहुत सारे शोध और समय के माध्यम से जाने के बाद यह पता चला कि कुछ कॉन्फ़िगरेशन के लिए हाइबरनेट इकाई प्रबंधक को देखना आवश्यक है। फिर इकाई प्रबंधक जार वापस रखो और फिर एक निर्भरता के रूप में जेटीए एपीआई जोड़ा और यह ठीक काम किया।

संबंधित मुद्दे