2010-12-07 9 views
7

नहीं बनाएगा मैं सूर्य जावा पेटस्टोर डेमो का उपयोग करने का प्रयास कर रहा हूं।
CatalogFacade कक्षा में निम्नलिखित एनोटेशन है:@PersistenceNnit एनोटेशन एक EntityManageFactory emf = null

@PersistenceUnit(unitName="myPetStorePU") 
private EntityManagerFactory emf; 

CatalogFacade सूर्य के सभी तरीकों में है:

EntityManager em = emf.createEntityManager(); 

लेकिन मैं ईएमएफ के लिए एक नल पॉइंटर एक्सेप्शन हो रही है जब createEntityManager की कोशिश कर रहा । लेकिन ... मैं ऐसे

के रूप में है कि रेखा के ऊपर निम्नलिखित पंक्ति जोड़ अगर
EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("myPetStorePU"); 
    EntityManager em = emf.createEntityManager(); 

तो ईएमएफ सफलतापूर्वक बनाया जाता है और दृढ़ता इकाई myPetStorePU भी सफलतापूर्वक डेटाबेस को जोड़ता है। तो यह persistence.xml वाक्यविन्यास की तरह दिखता है और इसका स्थान सही है। मैं समझना चाहता हूं कि एनोटेशन क्यों काम नहीं करता है क्योंकि मुझे लगता है कि प्रत्येक विधि में createEntityManagerFactory लाइन जोड़ने के विरोध में एनोटेशन का उपयोग करने का कोई कारण नहीं था।

मेरे src/META-INF/persistence.xml फ़ाइल इस तरह दिखता है:

<persistence-unit name="myPetStorePU"> 
    <description>Petstore Persistence Unit</description> 
    <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider> 

    <class>com.sun.javaee.blueprints.petstore.model.Tag</class> 
    <class>com.sun.javaee.blueprints.petstore.model.SellerContactInfo</class> 
    <class>com.sun.javaee.blueprints.petstore.model.Product</class> 
    <class>com.sun.javaee.blueprints.petstore.model.Item</class> 
    <class>com.sun.javaee.blueprints.petstore.model.Category</class> 
    <class>com.sun.javaee.blueprints.petstore.model.Address</class> 
    <class>com.sun.javaee.blueprints.petstore.model.ZipLocation</class> 
    <properties> 
     <property name="toplink.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/> 
     <property name="toplink.jdbc.url" value="jdbc:oracle:thin:@#############"/> 
     <property name="toplink.jdbc.user" value="####"/> 
     <property name="toplink.jdbc.password" value="#####"/> 
     <property name="toplink.logging.level" value="INFO"/> 
    </properties> 

</persistence-unit> 

संपादित करें: CatalogFacade petstore.model पैकेज में है और ServletContextListener

<listener> 
    <listener-class>com.sun.javaee.blueprints.petstore.model.CatalogFacade</listener-class> 
</listener> 
लागू करता है

index.jsp सूर्य में निम्न है:

<% 
CatalogFacade cf = (CatalogFacade)config.getServletContext().getAttribute("CatalogFacade"); 
List<Tag> tags=cf.getTagsInChunk(0, 12); 
%> 


public List<Tag> getTagsInChunk(int start, int chunkSize) { 
//The next line is required since the @PersistenceUnit annotation at the top of this class does not work 
    EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("myPetStorePU"); 
    EntityManager em = emf.createEntityManager(); 
    System.out.println("Entity manager " + emf); 
    Query query = em.createQuery("SELECT t FROM Tag t ORDER BY t.refCount DESC, t.tag"); 
    List<Tag> tags = query.setFirstResult(start).setMaxResults(chunkSize).getResultList(); 
    em.close(); 
    return tags; 
} 
+2

हमें बताएंगे कि कैसे आप 'CatalogFacade' का एक उदाहरण प्राप्त फिक्स का उपयोग करने जा। और यह क्या है - एक pojo, एक ejb, या? – Bozho

उत्तर

10

यदि एनोटेटेड ऑब्जेक्ट को कंटेनर (या तो वसंत/सीडीआई/ईजेबी कंटेनर) द्वारा प्रबंधित नहीं किया जाता है, तो इसमें कुछ भी इंजेक्शन नहीं मिलता है।

तो अपने पर्यावरण के आधार पर, प्रासंगिक उस ऑब्जेक्ट का उदाहरण प्राप्त करें।

आप ऊपर प्रौद्योगिकियों में से किसी का उपयोग नहीं कर रहे हैं, तो (वसंत/CDI/EJB) - तो आप @PersistenceUnit और @PersistenceContext उपयोग नहीं कर सकते। यूनिट प्राप्त करने के लिए मैन्युअल तरीके का उपयोग करें।

+0

मैं ग्रहण और टोमकैट का उपयोग कर रहा हूं। CatalogFacade एक श्रोता है। – jeff

+1

@jeff - तो आप '@ PersistenceUnit' का उपयोग नहीं कर सकते हैं। आपको कुछ संदर्भ की आवश्यकता है जो निर्भरता को इंजेक्ट करेगा। – Bozho

+0

यह मेरी समझ नहीं है: मुझे एप्लिकेशन प्रबंधित संदर्भ – YoYo

0

ऐसा होता है कुछ कारणों के लिए जब आप persistence.xml

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

में इस का उपयोग कर

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

समस्या