2009-07-20 8 views
13

मैं इन दोनों वर्ग (टेबल)अतिरिक्त फ़ील्ड को @ManyToMany Hibernate अतिरिक्त तालिका में जोड़ सकते हैं?

@Entity 
@Table(name = "course") 
public class Course { 

    @Id 
    @Column(name = "courseid") 
    private String courseId; 
    @Column(name = "coursename") 
    private String courseName; 
    @Column(name = "vahed") 
    private int vahed; 
    @Column(name = "coursedep") 
    private int dep; 
    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "student_course", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "student_id")) 
    private Set<Student> student = new HashSet<Student>(); 
//Some setter and getter 

और यह एक है:

@Entity 
    @Table(name = "student") 
    public class Student { 

     @Id 
     @Column(name="studid") 
     private String stId; 
     @Column(nullable = false, name="studname") 
     private String studName; 
     @Column(name="stmajor") 
     private String stMajor; 
     @Column(name="stlevel", length=3) 
     private String stLevel; 
     @Column(name="stdep") 
     private int stdep; 

     @ManyToMany(fetch = FetchType.LAZY) 
     @JoinTable(name = "student_course" 
       ,joinColumns = @JoinColumn(name = "student_id") 
       ,inverseJoinColumns = @JoinColumn(name = "course_id") 
     ) 
     private Set<Course> course = new HashSet<Course>(); 
//Some setter and getter 

इस कोड को एक अतिरिक्त तालिका डेटाबेस (student_course) में बनाया गया था चलाने के बाद, अब मैं जानना चाहता मैं कैसे कर सकते हैं की तरह इस तालिका में अतिरिक्त फ़ील्ड जोड़ें (ग्रेड, दिनांक, और ... (मैं student_course तालिका मतलब)) मैं कुछ हल देखने लेकिन मैं उन्हें पसंद नहीं है, इसके अलावा, मैं उनके साथ कुछ समस्या है:

First Sample

+0

आप \ @OrderColumn का उपयोग करके एक अतिरिक्त कॉलम जोड़ सकते हैं जो कि कई 2many रिश्तों के क्रम क्रम को संग्रहीत करने के लिए उपयोग किया जाने वाला एक int स्तंभ है। काश वे एक @DempolalColumns को एक सेडेट और टूडेट फ़ील्ड जोड़ने के लिए भी जोड़ देंगे –

उत्तर

16

यदि आप किसी लिंक की गई तालिका (STUDENT_COURSE) पर अतिरिक्त फ़ील्ड जोड़ते हैं, तो आपको स्काफमैन के उत्तर या किसी अन्य के अनुसार एक दृष्टिकोण चुनना होगा जैसा कि दिखाया गया है।

एक दृष्टिकोण जहां जुड़ा हुआ तालिका (STUDENT_COURSE) के अनुसार एक @Embeddable की तरह बर्ताव करता है:

@Embeddable 
public class JoinedStudentCourse { 

    // Lets suppose you have added this field 
    @Column(updatable=false) 
    private Date joinedDate; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="STUDENT_ID", insertable=false, updatable=false) 
    private Student student; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="COURSE_ID", insertable=false, updatable=false) 
    private Course course; 

    // getter's and setter's 

    public boolean equals(Object instance) { 
     if(instance == null) 
      return false; 

     if(!(instance instanceof JoinedStudentCourse)) 
      return false; 

     JoinedStudentCourse other = (JoinedStudentCourse) instance; 
     if(!(student.getId().equals(other.getStudent().getId())) 
      return false; 

     if(!(course.getId().equals(other.getCourse().getId())) 
      return false; 

     // ATT: use immutable fields like joinedDate in equals() implementation 
     if(!(joinedDate.equals(other.getJoinedDate())) 
      return false; 

     return true; 
    } 

    public int hashcode() { 
     // hashcode implementation 
    } 

} 

तो तुम दोनों छात्र और पाठ्यक्रम की कक्षाओं में होगा

public class Student { 

    @CollectionOfElements 
    @JoinTable(
     [email protected](name="STUDENT_COURSE"), 
     [email protected](name="STUDENT_ID") 
    ) 
    private Set<JoinedStudentCourse> joined = new HashSet<JoinedStudentCourse>(); 

} 

public class Course { 

    @CollectionOfElements 
    @JoinTable(
     [email protected](name="STUDENT_COURSE"), 
     [email protected](name="COURSE_ID") 
    ) 
    private Set<JoinedStudentCourse> joined = new HashSet<JoinedStudentCourse>(); 

} 

याद रखें: @ एंबेडेबल क्लास का जीवन चक्र अपनी इकाई इकाई (छात्र और पाठ्यक्रम दोनों) से जुड़ा हुआ है, इसलिए इसका ख्याल रखें।

सलाह: हाइबरनेट टीम @ManyToMany मैपिंग - कैस्केड ऑपरेशन में कुछ सीमाओं के कारण इन दो दृष्टिकोणों (@OneToMany (skaffman का उत्तर) या @ कोलेक्शंसऑफमेंट्स) का समर्थन करती है।

संबंध है,

+0

महान जवाब।यदि किसी को केवल सूची में मैपिंग के लिए इंडेक्स-कॉलम की आवश्यकता होती है, तो केवल @OrderColumn को जोड़ सकते हैं हालांकि – cproinger

+2

जब मैंने समाधान से ऊपर की कोशिश की तो मुझे 'संग्रह के लिए मानचित्रण में दोहराया गया कॉलम' त्रुटि मिली। कोई उपाय ? –

+0

मुझे अंकुर राययानी के समान त्रुटि मिल रही है, मेरा समाधान स्काफमैन है। छात्रवृत्ति के भीतर एम्बेडेड आईडी का उपयोग करके यह सुनिश्चित करने के लिए कि मेरे पास सही प्राथमिक कुंजी मेरे लिए चल रही है। और फिर मैं एम्बेडेड कुंजी हटा दिया और प्रत्येक manToOne संबंध –

7

छात्र_course तालिका पूरी तरह से दोनों इकाइयों के बीच संबंध रिकॉर्ड करने के लिए है। यह हाइबरनेट द्वारा प्रबंधित किया जाता है, और इसमें कोई अन्य डेटा नहीं हो सकता है।

जिस प्रकार का डेटा आप रिकॉर्ड करना चाहते हैं उसे किसी अन्य इकाई के रूप में मॉडलिंग करने की आवश्यकता है। शायद आप कोर्स और स्टूडेंट रिसेट (जिसमें ग्रेड, इत्यादि शामिल हैं) के बीच एक से कई सहयोग हो सकते हैं, और फिर स्टेंटेंटसेल और छात्र के बीच एक से अधिक संबंध हो सकते हैं।

+0

तनक्स मैन मैं इसे मानता हूं – Am1rr3zA

3

कई लोगों को छोड़ दें, छात्रकोर्से रिलेशनशिप नामक एक कक्षा बनाएं और छात्र और पाठ्यक्रम पर छात्र और पाठ्यक्रम पर कई लोगों को स्थापित करें।

आप DateEnrolled, DateKickedOut की तरह उस पर चीजों के सभी प्रकार के रख सकते हैं, आदि आदि

IMO कई-से-अनेक मानचित्रण एक चोर का एक सा है।

+0

तनक्स मैन मैं इसे – Am1rr3zA

+1

पर विचार करता हूं DateGotToGripsWithAssociations? :) – skaffman

2

स्वीकार किए जाते हैं जवाब दुर्भाग्य से मेरे लिए काम नहीं करता है, हाइबरनेट एक अजीब तरह से (सभी में शामिल होने के स्तंभों को दोहराया गया है) में तालिका में शामिल होने के उत्पन्न करता है। हालांकि, जॉइन टेबल के लिए समर्पित इकाई के साथ संस्करण ठीक काम करता है। यहां यह बहुत विस्तार से वर्णित है: http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/

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