2012-04-30 7 views
7

बीन बनाने के बाद, मैं EntityManager का उपयोग करके डेटाबेस से डेटा पुनर्प्राप्त करना चाहता हूं। कन्स्ट्रक्टर में यह संभव नहीं है, क्योंकि एंटीटीमेनर को कन्स्ट्रक्टर के नाम से इंजेक्शन दिया जाता है। इसलिए मैंने इसे @PostConstruct के साथ एनोटेटेड विधि में करने की कोशिश की। एपीआई के अनुसार, सभी इंजेक्शन किए जाने के बाद एक पोस्टकॉन्स्ट्रक्ट विधियों को बुलाया जाता है। क्वेरी कार्य निष्पादित करता है, लेकिन यह हमेशा खाली सूची देता है। यदि मैं एक ही विधि में एक ही विधि का उपयोग करता हूं, तो यह सही परिणाम देता है। क्या कोई जानता है, यह PostConstruct विधि में क्यों काम नहीं करता है?ईजेबी: पोस्टकॉन्स्ट्रक्चर विधि में एंटीटी मैनेजर का उपयोग

@Stateful(mappedName = "price") 
@Singleton 
@Startup 
public class PriceManagementBean implements PriceManagement { 

    @PersistenceContext 
    private EntityManager em; 

    private List<PriceStep> priceSteps = Collections.synchronizedList(new ArrayList<PriceStep>()); 


    public PriceManagementBean(){ 


    } 


    @PostConstruct 
    public void init(){ 
     javax.persistence.Query query = em.createQuery("SELECT ps FROM PriceStep ps"); 
     List<PriceStep> res = query.getResultList(); 
      ..... 
     } 
} 
+0

http://stackoverflow.com/questions/2399769/is-it-okay-to-pass-injected-entitymanagers देखें -to-ejb-beans-helper-classes---use – mglauche

+0

डीएसबी में मूल्यस्टेप्स कैसे और कहाँ जोड़े गए हैं? – Puce

+0

आपकी बीन दोनों 'स्टेटफुल' और 'सिंगलटन' को एनोटेट किया गया है, जिसकी अनुमति नहीं है। यदि आपका ईजेबी कंटेनर ईजेबी 3.1 का समर्थन नहीं करता है, तो शायद बीन वास्तव में स्टेटफुल है, और पोस्टकॉन्स्ट्रक्ट एक अनिर्धारित लेनदेन संदर्भ के साथ चल रहा है, और आपका एप्लिकेशन सर्वर उस अच्छी तरह से समर्थन नहीं करता है? आप किस एप्लिकेशन सर्वर का उपयोग कर रहे हैं? –

उत्तर

9

किसी को भी पता है, यह क्यों PostConstruct विधि में काम नहीं करता?

कारण 1 आप एक सेम एक ही समय में है कि नहीं बना सकते @Stateful और @Singleton (वैसे आप, लेकिन यह कोई मतलब नहीं के बाद से Singletons भी स्टेटफुल हैं कर देगा कर सकते हैं), कि कारणों में से एक है आपको परेशानी हो रही है इसमें कोई अपवाद नहीं है, लेकिन वहां एक संघर्ष है, आपको इसे पहले ठीक करने की आवश्यकता है।

बस इतना ध्यान रखें:

  • एक सिंगलटन सेम एक सेम है कि अपने राज्य mantains है। एप्लिकेशन में सिंगलटन का केवल एक उदाहरण है और इसे ऐप के सभी उपयोगकर्ताओं के बीच साझा किया जाता है। चूंकि यह एक साझा (शायद बेहतर समवर्ती) बीन है, इसलिए @ लॉक एनोटेशन का उपयोग करके किसी प्रकार की लॉकिंग तंत्र को लागू करने की आवश्यकता है।

  • एक स्टेटफुल बीन एक बीन है जो लेनदेन के बाद प्रत्येक राज्य को मंत्रमुग्ध करता है। जब
    स्टेटफुल सेम के साथ काम करने के लिए प्रत्येक उपयोगकर्ता की फलियों की एक प्रति जो सत्र के रूप में रूप में लंबे समय तक चलेगा हो जाता है - रहता है या एक विधि @Remove साथ एनोटेट तक कहा जाता है

कारण 2 यहां तक ​​कि अगर यह काम करता है, आप परिणामों तक पहुंचने में असमर्थ होंगे, क्योंकि आप उन्हें res नामक ऑब्जेक्ट में संग्रहीत कर रहे हैं जो केवल init() के अंदर से पहुंच योग्य है। मुझे लगता है कि आप वैरिएबल वैल्यूस्टेस पर लौटाए गए मान को असाइन करना चाहते हैं।

वैसे भी सबकुछ कहने के लिए आपके कोड में कई चीजें गलत हैं। मुझे नहीं पता कि आपकी सिस्टम आवश्यकताएं क्या हैं, लेकिन यहां मैं आपको एक साधारण समाधान दूंगा जो आपको डेटाबेस तक पहुंचने की अनुमति देगा:

मुझे लगता है कि आप किसी भी तरह से जीवन चक्र में डेटा वापस करने की कोशिश कर रहे हैं बीन क्योंकि आप बीन @ स्टेटेट है, तो आप बार-बार प्रश्न भेजने से बचना चाहते हैं। बात यह है कि, आपको ऐसा करने की ज़रूरत नहीं है, फिर भी आप अपना बीन @ स्टेटलेस बना सकते हैं और कई प्रश्नों के साथ अपने डेटाबेस पर जोर से बचने से बच सकते हैं। आपको क्या करना है @NamedQuery बनाएं।

तो @NamedQuery के साथ अपने इकाई PriceStep व्याख्या और क्वेरी स्ट्रिंग आप ने लिखा वहाँ दर्ज करें। http://docs.oracle.com/cd/B31017_01/web.1013/b28221/ent30qry001.htm

अगली बात मैं आपको सुझाव है कि है अपनी कक्षा PriceManagementBean रूप * @Stateless * टिप्पणी करने के लिए: इस लिंक में आप कैसे @NamedQueries का उपयोग करने के बारे में जानकारी मिल जाएगी। चिंता न करें अगर प्रत्येक अनुरोध में एक नई इकाई प्रबंधक बनाया गया है, जो डेटाबेस को बिल्कुल तनाव नहीं देता है, क्योंकि यह डोमेन मॉडल से इंटरैक्ट करता है। आपको @PostConstruct की आवश्यकता नहीं है, जब भी आपको इसकी आवश्यकता हो, तो बस अपने @NamedQuery को कॉल करें और यही वह है। ऐप सर्वर इसे कैश करेगा और उसे प्रत्येक उपयोगकर्ता को वापस दे देगा जिसके लिए इसे हमेशा डेटाबेस के साथ बातचीत किए बिना इसकी आवश्यकता होती है।

यहाँ एक codesnipet:

@Entity 
@NamedQuery(
    name="allPriceSteps", 
    queryString="SELECT ps FROM PriceStep ps" 
) 
public class PriceStep implements Serializable { 
... 
} 

अब सेम:

@Stateless 
public class PriceManagementBean implements PriceManagement { 

    @PersistenceContext 
    private EntityManager em; 

    public List<PriceStep> getAllPriceSteps() { 
     Query query = em.createNamedQuery("allPriceSteps"); 
     return query.getResultList(); 
    } 
} 

मुझे आशा है कि यह उपयोगी है। यदि आप अपनी सिस्टम आवश्यकताओं के बारे में अधिक जानकारी देते हैं तो हम आपको सर्वोत्तम अभ्यास पर सलाह दे सकते हैं।

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है, लेकिन आपका उत्तर मेरे मामले को कवर नहीं करता है। हमारे पास 'सिंगलटन' बीन' के रूप में कैश है, जो '@ पोस्टकोनस्ट्रक्चर' विधि में पॉप्युलेट हो जाता है। इसने अच्छी तरह से काम किया है लेकिन परीक्षणों के पुनर्लेखन के दौरान मुझे समस्या का अनुभव करना शुरू हो रहा है। मुझे लगता है कि कारण यह है कि पहले हमने पहले से ही आबादी वाले डेटाबेस के खिलाफ परीक्षण चलाए थे, लेकिन अब हम एचएसक्यूएलडीबी इन-मेमोरी का उपयोग करने की कोशिश करते हैं। चूंकि एक लेनदेन में परीक्षण चलाया जाता है, मुझे संदेह है कि '@ पोस्टकॉन्स्ट्रक्चर 'में कोड एक ही लेनदेन का हिस्सा नहीं है, जिसके परिणामस्वरूप खाली सूची है। क्या आपके पास इसके बारे में कोई विचार है? – Magnilex

+0

यहां वही है, और मैं राज्य या कुछ भी ऐसा नहीं कर रहा हूं। – momomo

-2

आपकी आवश्यकता प्रयास करें

  • @Startup आवेदन INIT दौरान सिंगलटन सेम प्रारंभ हो जाएगा [निम्नलिखित

    • @Stateful [एक समय में दोनों का उपयोग नहीं कर सकते] निकालें के आधार पर करें ध्यान दें कि एप्लिकेशन पूरी तरह से प्रारंभ नहीं किया गया था]। इससे EntityManager को लोड करने में कुछ समस्या हो सकती है और मुझे लगता है कि EntityManager पुल पूरी तरह से प्रारंभ नहीं हुआ था। पूरा आवेदन स्टार्टअप के बाद init कॉल करने के लिए प्रयास करें [यानी,] निकालें @Startup

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