2013-08-22 5 views
6

मैं जावा के साथ हाइबरनेट 3.0 का उपयोग कर रहा हूं।हाइबरनेट के माध्यम से डेटाबेस से एक पंक्ति और उसके सभी संदर्भों को कैसे हटाएं?

मेरे पास निम्नलिखित कक्षाएं हैं।

Teacher.java

private long id; 
private String teacherName; 
private List<Student> students; 
// getter-setter of all 

Subject.java

private long id; 
private String subjectName; 
private List<Student> students; 
// getter-setter of all 

Student.java

private long id; 
private String studentName; 

// getter-setter of both 

Teacher.hbm.xml

<class name="Teacher" table="teacher_master"> 
    <!--other mappings--> 

    <list name="students" cascade="refresh" table="teacher_student_master"> 
     <key column="teacher_id"/> 
     <index column="student_teacher_position" type="integer"/> 
     <many-to-many class="Student" column="student_id"/> 
    </list> 
</class> 

Subject.hbm.xml

<class name="Subject" table="subject_master"> 
    <!--other mappings--> 

    <list name="students" cascade="refresh" table="subject_student_master"> 
     <key column="subject_id"/> 
     <index column="student_subject_position" type="integer"/> 
     <many-to-many class="Student" column="student_id"/> 
    </list> 
</class> 

Student.hbm.xmlआईडी & studentName संपत्तियों के लिए मैपिंग शामिल हैं।

समस्या का सामना करना पड़ रहा हूँ है:

मैं हाइबरनेट के माध्यम से student_master से एक पंक्ति को हटा दें।

Student stu = new Student(); 
stu.setId(1l); 
session.delete(stu); 
transaction.commit(); 

लेकिन नष्ट कर दिया छात्र की संदर्भ (आईडी = 1) टेबल teacher_student_master और subject_student_master से नहीं हटाया जाता।

मैं इस मुद्दे को कैसे दूर कर सकता हूं?

नोट: अगर मैं & क्वेरी फायरिंग कोडिंग के बजाय हाइबरनेट के साथ किसी प्रकार की कॉन्फ़िगरेशन करके इस समस्या को दूर कर सकता हूं तो यह बहुत अच्छा होगा।

संपादित करें: मैंने यह link देखा है। लेकिन उसमें, यह उल्लेख किया गया है कि मुझे कुछ कोडिंग करने की ज़रूरत है, पहले छात्र = 1 से जुड़े सभी शिक्षकों को प्राप्त करें, फिर छात्र & की सूची से छात्र = 1 को हटा दें और फिर शिक्षक को अपडेट करें। मैं इस कोडिंग से बचना चाहता हूं। क्या यह संभव है?

उत्तर

0

आप उन व्यवहारों को @Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN) का उपयोग कर सकते हैं, जिन्हें आप इस व्यवहार में चाहते हैं। अधिक जानकारी के लिए this question देखें।

या, चूंकि आप एक्सएमएल के माध्यम से हाइबरनेट कॉन्फ़िगरेशन का उपयोग कर रहे हैं, तो कैस्केड = "डिलीट-अनाथ" का उपयोग करें। this blog post पर एक नज़र डालें जहां विभिन्न प्रकार के कैस्केड समझाए जाते हैं।

+2

@RAS एक्सएमएल मानचित्रण एनोटेशन का उपयोग किया जाता है, नहीं यह है। यदि आप एचबीएम मैपिंग का उपयोग करके जवाब प्रदान करते हैं तो यह बेहतर होगा। –

+0

मैंने आपके द्वारा दिए गए दोनों लिंक देखे हैं। लेकिन दोनों लिंक में, यह उल्लेख किया गया है कि मुझे कुछ कोडिंग करने की ज़रूरत है, पहले छात्र = 1 से जुड़े सभी शिक्षकों को प्राप्त करें, फिर छात्र की सूची से छात्र = 1 हटाएं और फिर शिक्षक को अपडेट करें। मैं इस कोडिंग से बचना चाहता हूं। क्या यह संभव है? – RAS

+0

ठीक है, मान लीजिए कि आपके पास निम्नलिखित सारणीएं हैं: छात्र, शिक्षक और पाठ्यक्रम (जो छात्र और शिक्षक को जोड़ता है)। छात्र के पाठ्यक्रम के संदर्भ में DELETE_ORPHAN का उपयोग करके, छात्र = 1 को हटाने से इस पाठ्यक्रम के सभी संबंधों को भी हटा दिया जाएगा। आपको सभी पाठ्यक्रमों को लाने और उन्हें मैन्युअल रूप से हटाने की आवश्यकता नहीं है, हाइबरनेट आपके लिए ऐसा करेगा। – Thiago

0

दोनों मैपिंग फ़ाइलों में cascade="delete" संपत्ति का उपयोग करें। यह आपकी समस्या का समाधान कर सकता है। यदि आप "रीफ्रेश" असाइन करना चाहते हैं तो ; का उपयोग करके कैस्केड करने के लिए एकाधिक गुणों को असाइन किया गया है।

+0

मुझे 'कैस्केड = हटाएं' के बारे में पता है। लेकिन मेरे ज्ञान के अनुसार यह काम करता है, अगर मैं ** teacher_master ** का रिकॉर्ड हटा देता हूं, तो यह ** teacher_student_master ** से रिकॉर्ड हटा देगा। मेरा मामला उलटा है। मैं ** student_master ** से रिकॉर्ड हटा रहा हूं और ** teacher_master ** से नहीं। – RAS

0

हाइबरनेट पंक्तियों को हटा नहीं देता क्योंकि छात्र वर्ग संबंधों से अवगत नहीं है। ऐसा करने के लिए आपको द्वि-दिशात्मक रिश्ते होना चाहिए: एक @ मैनी टॉनी सूची/शिक्षक का सेट और छात्र वर्ग

या कम से कम, एक डेटाबेस विदेशी कुंजी student_id पर कैस्केड हटा देता है तालिकाओं के शिक्षक_student_master और subject_student_master डेटाबेस में पंक्तियों को हटा देगा (मुझे लगता है कि पहला समाधान बेहतर है)।

लेकिन, किसी भी मामले में, आपको इस छात्र को हटाने के लिए छात्र के विषयों और शिक्षकों को फिर से शुरू करना चाहिए, भले ही डेटाबेस में पंक्ति हटा दी गई हो, छात्र वस्तु अभी भी वहां है और यह आपके आवेदन में कुछ समस्याएं उठा सकती है। .. आम तौर पर एक द्विदिश रिश्ते के साथ हाइबरनेट

साथ

सहेजने से पहले रिश्तों की देखभाल (दोनों ओर) बोल आसान

for(Teacher teacher: student.teachers) { 
    teacher.remove(student); 
} 

for(Subject subject: student.subjects) { 
    subject.remove(student); 
} 
संबंधित मुद्दे