2010-12-02 9 views
5

javax.persistence.EntityNotFoundException से बचने का कोई और शानदार तरीका है जब EntityManager.remove() पर किसी ऑब्जेक्ट पर कॉल किया जा रहा है जो वर्तमान में लगातार स्थिति में मौजूद हो या नहीं हो सकता है? मैं ऐसी परिस्थिति से बचने की कोशिश कर रहा हूं जहां मुझे ऑब्जेक्ट को हटाने के लिए 2 प्रश्न बनाने की आवश्यकता है। वर्तमान में मैं के साथ धोखा दे रहा हूँ:हाइबरनेट Entitymanager अपवाद के बिना खूबसूरती से हटा दें?

void remove(String id) { 
    T model = entityManager.getReference(type, id); 
    entityManager.remove(model); 
} 

लेकिन अगर मॉडल मौजूद नहीं है यह एक अपवाद फेंक देते हैं।

मैं कर सकता:

void remove(String id) { 
    T model = retrieve(id); 
    if(model != null) 
     entityManager.remove(model); 
} 

लेकिन वह (अब के लिए अलग एक कैश की धारणा की स्थापना) 2 प्रश्नों शामिल होगा।

+0

मैं अपवाद को पकड़ने के लिए वोट देता हूं। लोगों के कहने के बावजूद, जिस तरह से सूर्य ने जावा मुख्य एपीआई को प्रोग्राम किया है, कई बार सामान्य निष्पादन के दौरान प्रयास करने का प्रयास बिल्कुल ठीक है। बस दूसरे दिन मुझे 'classLoader.loadClass()' पंक्ति * 2 9 4 में एक * बहुत * कोर क्लास में अपेक्षित अपवाद को दूर करने की कोशिश की गई। –

+0

मुझे लगता है कि एक अपवाद एक MySQL डीबी पर एक अतिरिक्त क्वेरी की तुलना में तेज़/तेज होने की संभावना है। – Finbarr

+0

यदि आपके पास ऑब्जेक्ट संदर्भ आसान है, तो बस entityManager.contains (obj) पर कॉल करें - यदि यह गलत लौटाता है, तो आप इसे पहले ही हटा चुके हैं। (यह काम नहीं करेगा यदि आपके पास केवल आईडी है, या हो सकता है कि इसे एक अलग पर्सिस्टेंस संदर्भ में हटा दिया हो, जाहिर है, इस मामले में एक जेपीक्यूएल डिलीट कथन काम करेगा। – JesperSM

उत्तर

0

एकमात्र संभावना एक डेली और एक WHERE क्लॉज के साथ क्वेरी का उपयोग करना है। ठीक काम करता है, इसके अलावा कि जेपीए ऑब्जेक्ट पर हटाने के लिए किसी भी @PreDelete या @PostDelete संचालन को कॉल नहीं करेगा। मुझे लगता है कि आप वैसे भी नहीं चाहते हैं, तो प्रश्न के साथ जाओ। अगर आप श्रोताओं को फोन करना चाहते हैं, तो ऑब्जेक्ट (स्पष्ट रूप से) को पहले हटाने से लोड किया जाना चाहिए।

0

आप इकाई को हटाने से पहले select count(*) from ENTITY where id = :id कर सकते हैं और फिर जांच कर सकते हैं कि इकाई डेटाबेस में मौजूद है या नहीं। तो आप अपवाद के बिना हटा सकते हैं। यदि आप find(), , remove() जैसे सामान्य तरीकों के साथ एक सामान्य डीएओ का उपयोग कर रहे हैं ... आप क्वेरी remove() विधि में जोड़ सकते हैं।

उम्मीद है कि यह मदद करता है।

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