मुझे अब तक यह समस्या है, मैंने वेब और एसओ इन और आउट की खोज की है और अभी तक कोई समाधान नहीं मिला है। मुझे उम्मीद है कि आप उस पर मेरी मदद कर सकते हैं।मैप किए गए (माता-पिता-बच्चे) रिश्ते और कैश समस्या के साथ Hibernate @OneToMany
मैं की तरह दो संस्थाओं के बीच एक माता पिता के बच्चे का रिश्ता है निम्नलिखित:
@Entity
public class Parent {
// ...
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private Set<Child> children = new HashSet<Child>();
// ...
}
@Entity
public class Child {
// ...
@ManyToOne(fetch = FetchType.LAZY)
private Parent parent;
// ...
}
बात है कि जब मैं एक नए बच्चे बना सकते हैं और एक माता पिता के लिए असाइन करें, माता पिता को अद्यतन नहीं हो जाता है जब यह पहले से ही कैश में है।
Parent parent = new Parent();
em.persist(parent);
// ...
Child child = new Child();
child.setParent(parent);
em.persist(child);
parent.getChildren().size(); // returns 0
मैं @PreUpdate उपयोग करने के लिए स्वचालित रूप से माता पिता के लिए बच्चे को जोड़ने के लिए जब बच्चे एक समान होती है की कोशिश की है, लेकिन मामले में हम 2 अलग धागे में 2 इकाई प्रबंधक होते हैं जब (JBoss में की तरह), मुद्दा अभी तक मौजूद है, जब तक हम em.refresh(parent)
तो सवाल यह है कि - समस्या को आसानी से खत्म करने और यह सुनिश्चित करने का कोई तरीका है कि parent.getChildren()
हमेशा बच्चों की अद्यतित सूची लौटाएं?
में पाया जा सकता अपने व्यापक जवाब, माइकल के लिए धन्यवाद। मुझे इसमें कुछ अच्छी जानकारी मिली है। लेकिन, मुझे डर लग रहा है, यह समस्या मेरे पास है समाधान नहीं करता है क्योंकि दो अलग EntityManager उदाहरणों दो अलग-अलग कैश रखें और जब उनमें से एक अद्यतन करता है एक इकाई उदाहरण, एक दूसरे को अपडेट नहीं हुआ है और यह कैश की गई इकाई पुराना हो जाता है है – artemb
लगता है जैसे आपको अपडेट ट्रिगर्स को देखने की आवश्यकता है जो तब उस ऑब्जेक्ट को ले लेंगे और अन्य कैश अपडेट करेंगे। या यदि आप समाधान सुपर क्लस्टरिंग को कैशिंग करते हैं तो आप उसी क्लस्टर के उन दो कैश सदस्यों को बना सकते हैं। –
दुर्भाग्यवश मेरे पास हाइबरनेट के सत्र कैश पर कोई नियंत्रण नहीं है। या मैं है – artemb