2014-07-22 6 views
14

के लिए EntityManagerFactory पुनर्प्राप्त करने में असमर्थ मैं एक परियोजना बनाकर जेएसपी और सर्वलेट सीखने की कोशिश कर रहा हूं। मेरा लक्ष्य जेपीए, ओआरएम और दृढ़ता या यहां तक ​​कि ईजेबी पर भी ध्यान केंद्रित नहीं करना है। तो, कृपया मुझे उस पर एक ट्यूटोरियल या पुस्तक पढ़ने के लिए मत कहो। दुर्भाग्यवश, डेटाबेस के साथ संवाद करने के लिए SQL क्वेरी का उपयोग करने के लिए मुझे नहीं माना जाता है। इसके बजाय, मैंने jsp और servlets पर ध्यान केंद्रित करते समय दृढ़ता को प्रबंधित करने के लिए पूर्व-लिखित जेपीए कोड का उपयोग किया। java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU. मेरे परियोजना पर स्थित है - -java.lang.IllegalStateException को ठीक करने में असमर्थ: इकाई नाम

जब मैं अपने प्रोजेक्ट को चलाने, मैं त्रुटि मिलती हैhttps://github.com/double-whammy/affablebean.git डाउनलोड के रूप में जिप बटन निचले दाएं कोने पर है।

नोट - मेरा persistence.xml फ़ाइल मेटा-आईएनएफ फ़ोल्डर के अंदर है। मैंने फिर से अपनी परियोजना की जांच की और बनाया। तो उस कारण से इनकार किया जा सकता है।

मैं googled और कोई भी समाधान मदद की थी। मैं इस त्रुटि को कैसे ठीक करूं?

MyProject 
| 
|__java (src folder) 
| | 
| |__controller (package) 
| | |__ControllerServlet.java 
| | 
| |__entity (entity classes here) 
| |__session (facade classes for each entity class) 
| 
| 
|__WebContent 
    | 
    |__WEB-INF 
     | 
     |__view 
     | |__category.jsp   
     | | 
     | |etc... 
     | 
     |__index.jsp 

अपवाद:

Time|Info: Redirecting to /index.jsf 
Time|Info: Admin Console: Initializing Session Attributes... 
Time|Warning: EJB5184:A system exception occurred during an invocation on EJB CategoryFacade, 
method: public java.util.List session.AbstractFacade.findAll() 
Time|Warning: javax.ejb.EJBException 
at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748) 
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698) 
at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503) 
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4475) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2009) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1979) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 
at com.sun.proxy.$Proxy193.findAll(Unknown Source) 
at session.__EJB31_Generated__CategoryFacade__Intf____Bean__.findAll(Unknown Source) 
at controller.ControllerServlet.init(ControllerServlet.java:31) 
at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1583) 
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:1212) 
etc ................................................... etc... 
at java.lang.Thread.run(Thread.java:745) 

Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:138) 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:171) 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.java:834) 
at session.AbstractFacade.findAll(AbstractFacade.java:41) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
etc ................................................... etc... 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) 
... 33 more 

Time|Severe: WebModule[/AffableBean]StandardWrapper.Throwable 
javax.ejb.EJBException 
at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748) 
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698) 
at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503) 
etc ................................................... etc... 
at session.__EJB31_Generated__CategoryFacade__Intf____Bean__.findAll(Unknown Source) 
at controller.ControllerServlet.init(ControllerServlet.java:31) 
at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1583) 
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:1212) 
etc ................................................... etc... 
at java.lang.Thread.run(Thread.java:745) 

Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:138) 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:171) 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.java:834) 
at session.AbstractFacade.findAll(AbstractFacade.java:41) 
etc ................................................... etc... 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) 
... 33 more 

Time|Warning: StandardWrapperValve[ControllerServlet]: Allocate exception for servlet ControllerServlet 
java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:138) 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:171) 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.java:834) 
at session.AbstractFacade.findAll(AbstractFacade.java:41) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
etc ................................................... etc... 

Persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
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"> 
<persistence-unit name="AffableBeanPU" 
    transaction-type="JTA"> 
    <jta-data-source>jdbc/affablebean</jta-data-source> 
    <properties> 
     <property name="eclipselink.logging.level" value="FINEST" /> 
    </properties> 
</persistence-unit> 
</persistence> 
+0

क्या आपके पास डेटा सर्वर जेडीबीसी/Affablebean सही ढंग से आपके सर्वर पर स्थापित है? यह समस्या उससे संबंधित हो सकती है। केवल डेटा स्रोत इंजेक्शन करने का प्रयास करें, और देखें कि क्या आप कनेक्शन प्राप्त कर सकते हैं। – Gas

+0

@ गैस - हाँ, डेटा स्रोत सही ढंग से स्थापित किया गया था। मैं वास्तव में अपने डेटा स्रोत का उपयोग कर एक जेएसपी के अंदर एसक्यूएल प्रश्न चला गया।उसके बाद, मुझे एसक्यूएल को ईजेबी कोड के साथ प्रतिस्थापित करना था और यही वह समस्या थी जब समस्याएं शुरू हुईं। मैं मुख्य रूप से पर जेएसपी और सर्वलेट्स पर ध्यान केंद्रित करना चाहता था और अब मुझे ईजेबी सीखने के लिए मजबूर होना है जो लगभग एक मृत तकनीक है। – james

+0

आप किस सर्विसलेट कंटेनर को तैनात कर रहे हैं? – anon

उत्तर

2

क्योंकि अपनी परियोजना गलत संरचना है। ईजेबी और वेब एप्लिकेशन के लिए दो अलग-अलग हिस्सों को बनाएं, फिर उन्हें ईएआर में पैक करें या सीडीआई का उपयोग करें। जेपीए (जो EntityManagerFactory का हिस्सा है) बस आपके आवेदन के लिए कंटेनर द्वारा सक्रिय नहीं है।

उद्यम अनुप्रयोग के लिए:

http://www.youtube.com/watch?v=32wpTh1TmY4

CDI के लिए:

http://www.hascode.com/2011/02/creating-a-sample-java-ee-6-blog-application-with-jpa-ejb-cdi-jsf-and-primefaces-on-glassfish/

+0

ईजीबी और वेब एप्लिकेशन के लिए दो अलग-अलग हिस्सों को बनाएं, फिर उन्हें ईएआर में पैक करें या सीडीआई का उपयोग करें। ' कृपया मुझे बताएं कि एंटरप्राइज़ ऐप और सीडीआई क्या हैं और अंतर क्या हैं। ये बातें मेरे लिए नई हैं। जिस ट्यूटोरियल से मैंने अपना कोड बनाया है, उसके बारे में कुछ भी नहीं है। मेरी परियोजना संरचना ट्यूटोरियल के अनुसार है। यकीन नहीं है कि क्या समस्या पैदा हो रही है। धन्यवाद। – james

+1

सरल होने के लिए - नेटबीन्स/ग्रहण में केवल नई एंटरप्राइज़ प्रोजेक्ट बनाएं और देखें कि क्या उत्पन्न किया जाएगा। http://docs.oracle.com/javaee/5/tutorial/doc/figures/overview-applicationModule.gif –

3

आप देखेंगे कि आपके persistence.xmlMETA-INF में मौजूद है का उल्लेख है। यदि आप एक WAR फ़ाइल के रूप में इस आवेदन की तैनाती कर रहे हैं, अपने persistence.xml जरूरतों JPA 2.0 specification के अनुसार के रूप में

WEB-INF 
`- classes 
    `- META-INF 
     `- persistence.xml` 

पैक किया जा करने के लिए, अनुभाग 8.2 हठ यूनिट पैकेजिंग:

एक हठ इकाई परिभाषित किया गया है एक persistence.xml फ़ाइल द्वारा। जार फ़ाइल या निर्देशिका जिसका META-INF निर्देशिका है persistence.xml फ़ाइल को दृढ़ता इकाई की जड़ कहा जाता है।

• एक EJB-जार फ़ाइल
• एक युद्ध फ़ाइल
की वेब-INF/कक्षाएं निर्देशिका • एक जार फ़ाइल: जावा ईई वातावरण में, एक हठ इकाई की जड़ में से एक निम्न होना चाहिए एक युद्ध फ़ाइल
• EAR पुस्तकालय निर्देशिका में एक जार फ़ाइल के वेब-INF/lib निर्देशिका में
• एक आवेदन ग्राहक जार फ़ाइल

यह आवश्यक नहीं है कि एक EJB-जार या युद्ध फ़ाइल एक युक्त दृढ़ता इकाई एक ईएआर में पैक किया जाना चाहिए जब तक कि निरंतरता uni टी में ईजेबी-जेएआर या युद्ध के भीतर मौजूद लोगों के अलावा दृढ़ता वर्ग शामिल हैं।

11

/META-INF/persistence.xml वेब संसाधनों में नहीं, रनटाइम क्लासपाथ में समाप्त होना चाहिए। इसलिए, आपको इसे जावा स्रोत फ़ोल्डर में रखना होगा, वेब सामग्री फ़ोल्डर में नहीं। persistence.xml वेब संसाधनों से संबंधित नहीं है, लेकिन जावा बीन्स से संबंधित है।

यह ले जाएँ

अप:

MyProject 
|-- java (src folder) 
| |-- controller 
| | `--ControllerServlet.java 
| |-- entity 
| |-- session 
| `-- META-INF 
|   `-- persistence.xml <-- Here. 
`--WebContent 
    `-- WEB-INF 
      |-- view 
      | |-- category.jsp   
      | `-- etc.. 
      `-- index.jsp 

इस तरह का निर्माण /WEB-INF/classes अंदर /META-INF/persistence.xml के साथ उचित युद्ध संरचना का निर्माण होगा। आप ग्रहण का उपयोग कर रहे प्रतीत होते हैं, आप परियोजना के गुणों में जेपीए पहलू का चयन करके इसे भी प्राप्त कर सकते हैं।

enter image description here

इस तरह ग्रहण सही जगह पर एक persistence.xml उत्पन्न होगा।

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName cis_ejbPU 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:132) 

इसे सुलझाने के लिए मैं निम्नलिखित

1) pom.xml में निम्नलिखित जोड़ दिया:

enter image description here

+0

आपके उत्तर बलस के लिए धन्यवाद। मुझे इस मुद्दे का फिर से सामना नहीं हुआ क्योंकि मैंने एक नई प्रणाली पर विकास करना शुरू कर दिया था। नए sys में, मैं पागल की तरह googled और पाया कि आप जेपीए पहलुओं का उपयोग करने की जरूरत है। यकीन नहीं है कि यही कारण है कि मेरी परियोजना ने काम किया। त्रुटि पुन: उत्पन्न नहीं किया था। मुझे इस प्रश्न में त्रुटि मिली और कई अन्य ग़लत त्रुटियां मिलीं। अब मैं नेटबीन्स का उपयोग कर एक ही कोड विकसित कर रहा हूं, ट्यूटोरियल के लिए मूल आईडीई। अब तक, यह पूरी तरह से काम कर रहा है। – james

+1

उत्तर के रूप में, '/ मेटा-आईएनएफ/persistence.xml' को रनटाइम क्लासपाथ में समाप्त होना है, वेब संसाधनों में नहीं। आपकी समस्या इसलिए होती है क्योंकि आपके पास वेब संसाधनों में था। जेपीए पहलू का उपयोग करते समय (या मैन्युअल रूप से फ़ोल्डर और फ़िल्टर को सही जगह पर बनाते समय), फिर यह जावा स्रोत फ़ोल्डर में समाप्त होता है, जो अंततः रनटाइम क्लासपाथ में समाप्त होता है। – BalusC

0

मैं एंबेडेड Glassfish सर्वर के साथ एक समान मुद्दा है, की वजह से था निर्भरता

 <dependency> 
       <groupId>org.glassfish.extras</groupId> 
       <artifactId>glassfish-embedded-all</artifactId> 
       <version>3.2-b06</version> 
       <scope>provided</scope> 
      </dependency> 

     <dependency> 
      <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.4</version> 
       </dependency> 

2) हैशैप समर्थक सेट करें एम्बेडेड कंटेनर

File target = prepareModuleDirectory(); 
      Map<String, Object> properties = new HashMap<String, Object>(); 
      properties.put(EJBContainer.MODULES, target); 

      properties.put("org.glassfish.ejb.embedded.glassfish.installation.root", "./src/test/glassfish/"); 
      properties.put("org.glassfish.ejb.embedded.glassfish.configuration.file", "./src/test/glassfish/domains/domain1/config/domain.xml"); 
    container = javax.ejb.embeddable.EJBContainer.createEJBContainer(properties); 

3)

 private static final String MODULE_NAME = "embedded"; 
     private static final String TARGET_DIR = "target/" + MODULE_NAME; 


    private static File prepareModuleDirectory() throws IOException { 
     File result = new File(TARGET_DIR); 
     FileUtils.copyDirectory(new File("target/classes"), result); 
     FileUtils.copyFile(new File("target/test-classes/META-INF/persistence.xml"), 
       new File(TARGET_DIR + "/META-INF/persistence.xml")); 
     return result; 
    } 

4) के लिए perties

src\test\glassfish\domains\domain1\config 

तहत फ़ोल्डर संरचना बना सकते हैं और

<glassfish server install> glassfish\domains\domain1\config to src\test\glassfish\domains\domain1\config. 
तहत glassfish domain.xml जो मौजूद है नकल

मैं के लिए इस मुद्दे को हल करने के लिए उपर्युक्त कदम उठाए गए।

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