2010-10-06 8 views
11

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

e = (Event) scholarBean.merge(e); 
scholarBean.remove(e); 

मेरे प्रबंधित बीन में। यह मुझे यह त्रुटि

java.lang.IllegalArgumentException: Entity must be managed to call remove: [email protected], try merging the detached and try the remove again. 

तो मैं उन सत्रों को अपने सत्र बीन के अंदर लाता हूं, और यह काम करता है। कोई विचार क्यों?

Managed Bean

और

myEJB.java

public void deleteEvent(Event e){ 
    e = (Event) merge(e); 
    em.remove(e); 
} 

उत्तर

17

मैं जानता हूँ कि मैं इसे हटाने

से पहले इकाई विलय करने के लिए है

बिल्कुल नहीं। निकालने के लिए पारित वस्तु एक इकाई होना चाहिए और अलग नहीं होना चाहिए। यह अलग है।

लेकिन मैंने कभी सोचा नहीं कि मुझे इसे ईजेबी के अंदर करना है। सबसे पहले मैं इन (...)

चलो देखते हैं आप क्या कर रहे हैं:

1: e = (Event) scholarBean.merge(e); 
2: scholarBean.remove(e); 

तो 1: में, आप एक EJB (लेन-देन-दायरे वाले हठ प्रसंग के साथ बहुत संभावना) कहते हैं कि इकाई विलय करता है। लेकिन फिर विधि समाप्त होती है, लेनदेन करता है, दृढ़ता संदर्भ बंद हो जाता है, लौटाई गई इकाई अलग अलग कर देता है।

और 2: में, आप (अभी भी) अलग इकाई को ईजेबी में पास करते हैं और remove पर प्रयास करते हैं, जिसकी अनुमति नहीं है। और KaBOOM!

तो फिर मैं उन दो लाइनों को अपने सत्र बीन के अंदर लाता हूं, और यह काम करता है। कोई विचार क्यों?

यह काम करता है क्योंकि अब आप JTA लेन-देन से जुड़े दृढ़ता संदर्भ के दायरे के भीतर काम कर रहे हैं और आप इस प्रकार वास्तव में गुजर रहे हैं remove को इकाई में कामयाब रहे।

+0

अद्भुत जवाब। बहुत बहुत धन्यवाद –

+0

@ हैरी आपका स्वागत है। –

7

... और तुम भी उन गठजोड़ कर सकते हैं:

तो जैसा:

public void deleteManCheck(ManCheck manCheck) { 
    em.remove(em.merge(manCheck)); 
} 
2

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

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

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