मेरा प्रश्न यहां मेरे अन्य प्रश्न Explicit delete on JPA relationships जैसा ही है, लेकिन मैंने इसे और अधिक विस्तृत उत्तरों की गारंटी देने के लिए इसे सरल बनाने के बारे में सोचा।क्यों विलय को किसी रिश्ते में एक से अधिक पर कैस्केड नहीं किया गया है
कल्पना कीजिए कि मेरे माता-पिता और बच्चे के बीच एक बहुत ही रिश्ते है।
@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private List<Child> children;
}
@Entity
public class Child {
private String name;
@ManyToOne
private Parent owner;
}
मेरी UI में, मैं माता-पिता की एक सूची दिखा रहा हूँ। उपयोगकर्ता एक माता-पिता का चयन कर सकता है और वह अपने बच्चों की सूची संपादित कर सकता है। इसे दिखाने के लिए, मैंने वर्तमान पेरेंट संपादित का प्रतिनिधित्व करने के लिए एक वर्तमान पैरेंट चर का उपयोग किया है। उपयोगकर्ता बच्चों के नाम को जोड़ने/संपादित करने का विकल्प चुन सकता है।
बटन पर क्लिक करने पर, मैं एक ईजेबी कॉल का उपयोग करके नए बच्चों की सूची को सहेज लेगा।
@ViewScoped
public class MyBean(){
private Parent currentParent;
@EJB
private MyEJB myEJB;
public void saveChanges(){
myEJB.save(currentParent);
}
}
मेरे EJB कॉल इस तरह दिखता है।
@Stateless
public class MyEJB{
@PersistenceContext(unitName = "MyPU")
private EntityManager em;
public void save(Parent parentNew){
Parent pOld = em.find(entityClass, p.getId());
if(pOld !=null){
pOld.setName(parentNew.getName());
pOld.setChildren(parentNew.getChildren());
em.merge(pOld);
}
}
}
मेरे समस्या यह है कि, मैं माता-पिता का नाम, लेकिन बच्चों सूची में कोई परिवर्तन डीबी में प्रतिबिंबित नहीं होता है को बदलने में सक्षम हूँ। यह बच्चों को हटाने/अपडेट/जोड़ने के लिए किसी भी SQL को परिवर्तित या निष्पादित नहीं करता है।
कारण क्या हो सकता है?
अद्यतन
खैर कुछ परीक्षण और त्रुटि के बाद और विभिन्न लिंक के माध्यम से पढ़ने, ऐसा लगता है कि मेरे @onetomany में orphanRemoval विकल्प सेट मेरी समस्या का समाधान होगा। Eclipselink विलय के दौरान अनाथ पंक्तियों को स्वचालित रूप से हटा देता है।
तो जेपीए जटिलता के लिए बहुत ..
@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER,orphanRemoval = true)
private List<Child> children;
}
शायद यह मदद करेगा: http://stackoverflow.com/questions/10656765/handling-collection-updates-with-jpa – JMelnik
हाय, मुझे यकीन नहीं है कि मुझे उस लिंक का जवाब मिल गया है, तो आपका मतलब है कि मेरे पास है संग्रह के माध्यम से लूप करने और इसे एक-एक करके बचाने के लिए? मैंने वास्तव में सोचा कि eclipselink मेरे संग्रह की बचत को संभालेगा? तो उदाहरण के लिए मेरे पास एक इकाई में 5 बच्चे हैं, और फिर मैंने इसे केवल दो बच्चों के साथ संपादित किया, जब मैं विलय ऑपरेशन को कॉल करता हूं, तो यह पंक्तियों को हटाने/जोड़ने का ख्याल रखेगा। जानकारी के लिए धन्यवाद –