2014-10-13 8 views
5

पर काम नहीं कर रहा है, मैं विभिन्न संबंधों (केवल @ManyToOne) में शामिल एक इकाई को हटाने के लिए कड़ी मेहनत कर रहा हूं - हालांकि, em.remove पर कॉल करने के बाद, हाइबरनेट कुछ भी नहीं हटाता है, सबकुछ अपरिवर्तित रहता है। बाईंहाइबरनेट एंटिटी मैनेजर: संदर्भित इकाई को

public class E6{ 

    @ManyToOne(optional = false) 
    private E1 e1;  

    @ManyToOne(optional = false) 
    private E2 e2; 

    @ManyToOne(optional = false) 
    private E3 e3; 

    @ManyToOne(optional = false) 
    private E4 e4; 

    @ManyToOne(optional = false) 
    private E5 e5; 
} 

(:


मैं 5 संस्थाओं (E1 - E5) है, इस तरह के प्रश्न में इकाई (E6) को संदर्भित:

@Entity 
public class EX { 
    @OneToMany(mappedBy = "eX", fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REMOVE }) 
    private Set<E6> e6s; 
} 

E6 ही रिवर्स @ManyToOne संबंध है आउट आईडी, अतिरिक्त कॉलम इत्यादि ...)


जब भी मैं em.remove(instanceOfE6) पर कॉल करता हूं, तो बस कुछ भी नहीं होता है। मैंने हाइबरनेट एसक्यूएल-आउटपुट जोड़ा और DELETE क्वेरी निष्पादित करने का एक भी प्रयास नहीं देख सकता।

के बाद से हटाए जाने के एक ajax अनुरोध और एक ताजा EntityManager से भी हो सकता है, मैं हटाए जाने से पहले विलय करने के लिए एक कॉल कहा, कारण otherwhise मैं एक इकाई अप्रबंधित अपवाद मिलती है:

em.remove(em.merge(instanceOfE6)); 

लेकिन कुछ भी नहीं । राज्य अपरिवर्तित बनी हुई है।

तो मैंने इकाई को हटाने से पहले सभी संबंधों को साफ़ करने के लिए @PreRemove विधि जोड़ने का प्रयास किया ... विधि कभी नहीं बुलाया जाता है।

मैंने कोशिश की विभिन्न कास्केड संचालन (सहित Cascade.ALL) - लेकिन सभी मैं हटाने और जारी रहती है की जरूरत है, कि के रूप में अच्छी तरह से काम करना चाहिए के बाद से।


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

कोई विचार?

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


मैं भी उम्मीद है कि हाइबरनेट लिंक रद्द इकाई whipe होगा सभी संबंधों (बुद्धिमान वस्तु) से प्रश्न में इकाई को हटाने, और शेष संस्थाओं में से एक पर em.merge() कॉल करने की कोशिश,।

+1

क्या आपने लेनदेन किया था? –

+0

क्या आपने 'em.flush()' को कॉल किया था? – jmvivo

+0

@DavidLevesque autocommit मोड ... – dognose

उत्तर

13

मैं इस समस्या (रों) पता लगा - वास्तविक उनमें से दो किए गए हैं: (इस यहाँ छोड़कर, यदि किसी ने वही समस्या भर में ठोकर)

मैं उल्लेख किया है, विलोपन एक ajax में होना चाहिए था निवेदन। इसलिए, सरल कॉलिंग

em.remove(instanceOfE6); 

परिणामस्वरूप java.lang.IllegalArgumentException: Removing a detached instance अपवाद हुआ।इसलिए, मैंने विलय का उपयोग करके दृष्टिकोण की कोशिश की:

em.remove(em.merge(instanceOfE6)); 

जो त्रुटि उत्पन्न नहीं करता - लेकिन सरल काम नहीं करता था। मैं के रूप में इस पोस्ट में उल्लेख का पता लगाने-प्रवेश करने हाइबरनेट के लिए सक्षम: JPA/Hibernate remove entity sometimes not working यह पता लगाने की क्या गलत हो गया था, और वास्तव में, इकाई हटाने की कोशिश कर के परिणामस्वरूप:

TRACE [org...DefaultPersistEventListener] un-scheduling entity deletion ... 

जाहिर दूर करने के लिए इकाई अभी भी अन्य संस्थाओं से जुड़ा है , जो उस समस्या का कारण बनता है जो हटाना रद्द कर देता है, इसलिए मैंने हटाने से पहले संबंधों को हटाने की कोशिश की। आप E6 का उदाहरण से देख सकते हैं, मैं @ManyToOne(optional = false) इस्तेमाल किया, जिसका मतलब है मैं अशक्त करने के लिए बाहर जाने वाले संदर्भ सेट नहीं कर सकता है, या यह जब merge बुला अपवाद का कारण होगा।

मेरी पहली संबंधों को साफ करने का प्रयास किया गया था, "सेट की सफाई" क्योंकि मैं मान लिया है कि इकाई मैं हटाना चाहते हैं उसके बाहर जाने वाले संबंधों की सफाई की आवश्यकता नहीं है। ऐसा नहीं है, लेकिन मैं विस्तार में एक छोटे से बाद में इस रूपरेखा होगी:

तो, कोड अब

instanceOfE6.getE1().getE6s().remove(instanceOfE6); 
instanceOfE6.getE2().getE6s().remove(instanceOfE6); 
instanceOfE6.getE3().getE6s().remove(instanceOfE6); 
instanceOfE6.getE4().getE6s().remove(instanceOfE6); 
instanceOfE6.getE5().getE6s().remove(instanceOfE6); 

em.remove(em.merge(instanceOfE6)); 

एक ही मुद्दे की तरह लग रहा था: विलोपन निरस्त किया गया। मुझे स्पष्ट तथ्य याद आया, कि merge पर कॉल करना होगा। सेट्स के अंदर प्रविष्टियों को पुनर्स्थापित करें, मैंने अभी हटा दिया है, क्योंकि exampleOfE6 अभी भी अन्य इकाइयों पर शून्य-संदर्भ नहीं है। इसलिए हटाना फिर से रद्द कर दिया गया था।

अंत में समाधान का समाधान। संदर्भ और अंतिम विलोपन हटाने से पहले मर्ज करने के लिए किया गया था:

if (!em.contains(instanceOfE6)){ 
    instanceOfE6 = em.merge(instanceOfE6); 
} 

instanceOfE6.getE1().getE6s().remove(instanceOfE6); 
instanceOfE6.getE2().getE6s().remove(instanceOfE6); 
instanceOfE6.getE3().getE6s().remove(instanceOfE6); 
instanceOfE6.getE4().getE6s().remove(instanceOfE6); 
instanceOfE6.getE5().getE6s().remove(instanceOfE6); 

em.remove(instanceOfE6); 

मैं काफी यकीन है कि अगर मैं सब कुछ 100% सही समझाया नहीं कर रहा हूँ, लेकिन कम से कम मैं पुन: पेश और करके समस्या को ठीक कर सकते हैं कोड को आगे और आगे बदलना।

+2

आप एक lifesaver हैं। दो घंटे के लिए इस के साथ संघर्ष कर रहा है। बहुत बहुत धन्यवाद। लोग, इकाई पेड़ों के लिए देखें (मुझे groupToRemove.getParent() प्राप्त करना था। GetSubgroups()। निकालें (groupToRemove), और कैस्केड = कैस्केड टाइप टाइप के साथ माता-पिता को मैप करना था)। चीयर्स – jpangamarca

+1

'groupToRemove.getParent()। GetSubgroups()। हटाएं (groupToRemov e) 'यही वही है जो मैंने किया था। यह f **** अजीब लग रहा है ... लेकिन इसमें शामिल होना: यह तार्किक है :-) – dognose

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