2015-07-17 6 views
10

क्या किसी के पास इस समस्या के लिए कोई समाधान है: https://hibernate.atlassian.net/browse/HHH-9663?जेपीए अनाथ हटाने OneToOne संबंधों के लिए काम नहीं करता

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

@Entity 
public class Parent { 
    ... 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "child_id") 
    private Child child; 
    ... 
} 

@Entity 
public class Child { 
    ... 
    @Lob 
    private byte[] data; 
    ... 
} 

मैं वर्तमान में मैन्युअल रूप से हटाने से अनाथ बच्चों द्वारा इस के आसपास काम कर रहा हूँ:

यहाँ नमूना डोमेन मॉडल है।

उत्तर

9

Cascading केवल entity state transitions कि एक जनक से एक बाल तक पहुंचने के लिए समझ में आता है। आपके मामले में, माता-पिता वास्तव में इस संगठन का बच्चा था (एफके होने)।

बजाय इस मानचित्रण के साथ प्रयास करें:

@Entity 
public class Parent { 
    ... 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent") 
    private Child child; 
    ... 
} 

@Entity 
public class Child { 

    @OneToOne 
    @JoinColumn(name = "parent_id") 
    private Parent parent; 

    ... 
    @Lob 
    private byte[] data; 
    ... 
} 

और अनाथ हटाने झरना, अब आप की जरूरत है:

Parent parent = ...; 
parent.getChild().setParent(null); 
parent.setChild(null); 
+1

मैं इस कोशिश की और यह काम कर रहा है के रूप में आप का वर्णन किया लेकिन किसी कारण से मेरी आलसी लोडिंग अब काम करना बंद कर दिया है। मैंने जेनरेट की गई क्वेरी को देखा और मैं माता-पिता और माता-पिता के लिए दूसरे को शामिल करने के लिए दो चुनिंदा कॉल देख सकता हूं। कोई विचार? – ankurvsoni

+0

दो चयनों का अर्थ है लाज़ी काम करता है। आप एक एचक्यूएल/जेपीक्यूएल क्वेरी का उपयोग कर फ़ेच में शामिल हो सकते हैं। –

+0

मेरा मतलब था जब मैं कुछ ऐसा करता हूं - अभिभावक परिणाम = repository.findOne (parent.getId())। मैं दो चयन देखता हूं। मैं केवल तभी सोचता था जब मैं कुछ ऐसा करता हूं: result.getChild() - मुझे दूसरा चयन दिखाई देगा। क्या यह सही धारणा नहीं है? – ankurvsoni

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