2011-08-22 11 views
6

के साथ "एंटीटी नहीं मिला" त्रुटि बाईपास कभी-कभी किसी इकाई के सभी संदर्भों को हटाने के लिए यह काफी कठिन (या प्रदर्शन समस्या) है।जेपीए

उदाहरण के लिए, मेरे पास एक व्यक्ति वस्तु है जिसके पास किसी अन्य व्यक्ति वस्तुओं के संबंध हैं।

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

एक आदर्श दुनिया में, मैं व्यक्ति वस्तु को हटाना चाहता हूं और जब कोई अन्य व्यक्ति इस व्यक्ति का संदर्भ लेता है (क्योंकि इसकी पहचान उसके आईडी में है), तो बस शून्य वापस आती है।

तथ्य जेपीए शिकायत है कि

javax.persistence.EntityNotFoundException: No row with the given identifier exists 

वहाँ एक अशक्त संदर्भ और इस मामले में नहीं एक अपवाद वापस जाने के लिए जेपीए के लिए मजबूर करने का कोई तरीका है है?

उत्तर

16

आप @NotFound एनोटेशन NotFoundAction.IGNORE के साथ एनोटेशन का उपयोग कर सकते हैं, जो एक संबंधित इकाई मौजूद नहीं है, तो शून्य वापस आ जाएगा।

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

+0

जो वही था जो मैं खोज रहा था! बहुत बहुत धन्यवाद। यह हाइबरनेट विशिष्ट है, है ना? –

+1

मुझे खुशी है कि इससे मदद मिली और हां, एनोटेशन विशिष्ट – Augusto

+0

@Augusto हाइबरनेट क्यों है इस वसंत को पहली बार इस अपवाद को फेंक रहा है? – svlada

5

नहीं है, कम से कम कुछ भी नहीं मानक (जेपीए)

लेकिन आप नियंत्रित कर सकते हैं कि ये संघ का उपयोग कर cascade विशेषता OT @*ToMany और @*ToOne एनोटेशन के साथ होता है।

0

आप @NotFound (action = NotFoundAction.IGNORE) का उपयोग करेंगे, यह शून्य इकाइयों को छोड़ देगा। लेकिन (अगस्तो के रूप में कहा गया है) यदि आप उदाहरण के लिए प्राइमफेस डेटाटेबल का उपयोग कर रहे हैं और अपनी संपत्ति में @NotFound (action = NotFoundAction.IGNORE) की वजह से 10 पंक्तियां प्राप्त करें और 2, छोड़ दें, आपके पास 10 पंक्तियां होंगी और 8 नहीं (वास्तव में भूत पंक्तियां)।

@NotFound(action=NotFoundAction.IGNORE) 
private Product p;