2011-01-02 12 views
5

के साथ तालिका से हटाना मैं जेपीए 2 और हाइबरनेट कार्यान्वयन का उपयोग कर रहा हूं।@OneToOne एनोटेशन

मैं इस तरह सरल मानचित्रण मिल गया है:

@Entity 
class Topic { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 

    int id; 

    @OneToOne(cascade = ALL) 
    @JoinColumn(name = "id_poll") 
    private Poll poll; 

} 

@Entity 
class Poll { 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    int id; 
} 

अब, जब मैं एक पोल वस्तु जो विषय में भी है को नष्ट मैं कोई त्रुटि मिलती है।

java.sql.SQLException: वफ़ादारी बाधा उल्लंघन FKCC42D924982D3F4B तालिका: [? चुनावों से हटाना जहां आईडी =] बयान में विषय

मैं समझता हूँ कि यह है, क्योंकि मैं पोल ​​रिकॉर्ड को नहीं हटा सकते अगर इसमें किसी अन्य तालिका में संदर्भ हैं। इस समस्या का समाधान किस प्रकार से किया जा सकता है? क्या मुझे विषय तालिका में मैन्युअल रूप से मतदान = शून्य सेट करना है या क्या कोई बेहतर समाधान है?

उत्तर

5

यह अपेक्षित व्यवहार:

द्वि-दिशात्मक रिश्तों के साथ एक आम समस्या आवेदन अद्यतन रिश्ते के एक तरफ है, लेकिन दूसरी तरफ अद्यतन नहीं मिलता है, और सिंक्रनाइज़ेशन से बाहर हो जाता है। जेपीए में, सामान्य रूप से जावा में में यह एप्लिकेशन की ज़िम्मेदारी है, या ऑब्जेक्ट मॉडल संबंध बनाए रखने के लिए है।

स्रोत: Object corruption, one side of the relationship is not updated after updating the other side

इस संभाल करने के लिए सही जगह एक @PreRemove कॉलबैक में है:

@Entity 
class Poll { 

    ... 

    @PreRemove 
    private void preRemove() { 
     Poll poll = topic.getPoll(); 
     topic.setPoll(null); 
    } 
} 

यह भी देखें: Have JPA/Hibernate to replicate the “ON DELETE SET NULL” functionality

1

ऐसा लगता है कि जेपीए 2 में @OneToOne एनोटेशन में एक अनाथ रिमूवल ध्वज है, आप इसे सेट करने का प्रयास कर सकते हैं और देख सकते हैं कि यह इसे शानदार तरीके से हटा देता है या नहीं।

+1

नहीं, मैं इस कोशिश की और यह अभी भी नहीं करता है ' टी काम .. मुझे अभी भी एक ही त्रुटि मिली है .. – Dawid

1

मैं अब तक कोई समाधान नहीं ढूंढ पा रहा था, इसलिए इससे पहले कि मैं पोल ​​ऑब्जेक्ट हटा दूं, मुझे हमेशा एक विषय वस्तु मिलती है जिसमें पूल दिया जाता है और इसे शून्य पर सेट किया जाता है।

Topic topic = entityManager.find(Topic.class, 1); 
Poll poll = topic.getPoll(); 
topic.setPoll(null); 
entityManager.remove(poll); 

और यह सही तरीके से काम करता है।

0

समस्या इस तथ्य में निहित है कि आप दोनों ओर ऑटो-जेनरेटेड आईडी का उपयोग कर रहे हैं। जब आप मूल इकाई को बनाए रखते हैं, तो बच्चे की इकाई भी जारी रहती है लेकिन मूल इकाई के अंदर इसकी आईडी डेटाबेस से उत्पन्न एक के साथ अद्यतन नहीं होती है।

नतीजतन, जब आप माता-पिता को हटाते हैं, तो आप बच्चे को नहीं हटाएंगे, क्योंकि बच्चे के पास कोई आईडी नहीं है।

मैन्युअल रूप से बच्चे इकाई और अनाथ रिमूवल की आईडी सेट करने का प्रयास करें।

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