2012-02-18 24 views
13

यहां क्या हो रहा है?इकाई को कॉल करने के लिए प्रबंधित किया जाना चाहिए

@Stateless 
@LocalBean 
public class AppointmentCommentDao { 
    public void delete(long appointmentCommentId) { 
     AppointmentComment ac = em.find(AppointmentComment.class, appointmentCommentId); 
     if (ac != null) 
     { 
      em.merge(ac); 
      em.remove(ac); 
     } 
    } 
    @PersistenceContext 
    private EntityManager em; 
} 

कॉल पर remove को मैं संदेश जा रहा है Entity must be managed to call remove: ...., try merging the detached and try the remove again.

+0

em.find (...) विधि के साथ यह हल। –

उत्तर

18

अपने मामले मर्ज में के साथ एक IllegalArgumentException की जरूरत नहीं है मिलता है, क्योंकि एसी em.find और उन्हें बीच किसी भी बिंदु में deattached नहीं है .remove

सामान्य तौर पर जब इकाई deattached है, EntityManager की विधि विलय तर्क के रूप में लेता है और इकाई रिटर्न कामयाब उदाहरण। तर्क के रूप में दी गई इकाई संलग्न नहीं होती है। उदाहरण के लिए यह समझाया गया है: EntityManager.merge

AppointmentComment toBeRemoved = em.merge(ac); 
    em.remove(toBeRemoved); 
+0

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

+0

हालांकि, मैं आपका मुद्दा लेता हूं, कि आप आगे बढ़ने वाले मर्ज से लौटे ऑब्जेक्ट का उपयोग करना चाहते हैं, न कि ऑब्जेक्ट में पारित। +1 –

+0

आप बिल्कुल सही हैं, आपके कोड को मर्ज किए बिना काम करना चाहिए, क्योंकि किसी भी बिंदु पर एसी को निष्क्रिय नहीं किया जाता है। मैंने पहली बार माना कि यह अतिव्यापी उदाहरण था। मैं जवाब अपडेट करूंगा। –

6

इस प्रयास करें:: आप जाने के लिए है

entity = getEntityManager().getReference(AppointmentComment.class, entity.getId()); 
getEntityManager().remove(entity); 
संबंधित मुद्दे