2011-12-20 9 views
10

मेरे पास ईजेबी में कई टोमनी बनाने के लिए एक सवाल है, एक संयुक्त संपत्ति के पास संपत्ति कैसे हो सकती है?
यहां एक उदाहरण है, छात्र और पाठ्यक्रम कई हैं, हर छात्र के पास कई पाठ्यक्रम हैं, और कई छात्र एक कोर्स चुनते हैं।जेपीए ManyToMany, कैसे शामिल हो सकता है Table एक संपत्ति है?

@Entity 
    public class Student implements Serializable { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     Long id; 
     String name; 
     private Collection<Course> courses; 

     @ManyToMany(mappedBy = "students",cascade=CascadeType.ALL)  
     public Collection<Course> getCourses() { 
      return this.courses; 
     } 

     public void setCourses(Collection<Course> courses) { 
      this.courses = courses; 
     } 

    } 


    @Entity 
    public class Course implements Serializable { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     Long id; 
     String name; 
     private Collection<Student> students; 

     @ManyToMany(cascade=CascadeType.ALL) 
     @JoinTable(name = "Student_Course", 
     joinColumns = {@JoinColumn(name = "Course_ID", referencedColumnName = "id")}, 
     inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName = "id")}) 

     public Collection<Student> getStudents() { 
      return this.students; 
     } 

     public void setStudents(Collection<Student> students) { 
      this.students = students; 
     } 
    } 

हालांकि अगर मेरे पास जॉइनटेबल में कोई संपत्ति है, उदाहरण के लिए प्रत्येक छात्र के पास एक कोर्स के लिए एक स्कोर होता है। मैं इसे कई लोगों के साथ ईजेबी में कैसे बना सकता हूं?
आपके ध्यान के लिए बहुत धन्यवाद!

+1

यदि आपके संबंध में संपत्ति है, तो आपको इसे इकाई के रूप में मॉडल करना चाहिए। यह प्रश्न लगभग समान है: http://stackoverflow.com/questions/7602386/mapping-value-in-junction-table-to-entity/7603036#7603036 संबंध का प्रतिनिधित्व करने वाली इकाई का नाम (कोर्स एसिग्मेंटमेंट) आपके लिए काफी अच्छा फिट बैठता है मामला। –

+3

यह संभव नहीं है, आप रिश्ते में संपत्ति नहीं जोड़ सकते हैं। यदि आपको जॉइन टेबल में संपत्ति तक पहुंचने की आवश्यकता है, तो वह संपत्ति कुछ इकाई से संबंधित है और नतीजतन आपको तीसरी इकाई की आवश्यकता है। –

+0

क्षमा करें, मैंने इसे सही किया। मेरे पास एक और सवाल है, जब मैंने संयुक्त रूप से एक पीके के रूप में @Embeddable वर्ग का उपयोग किया, यह काम नहीं करता (संकलित विफल), किसी ने कहा कि जेपीए 2.0 इसका समर्थन नहीं करता है! कृपया इसे देखें [jpa-eclipselink-manytomany-with-dat] (http://stackoverflow.com/questions/4013397/jpa-eclipselink-manytomany-with-data), क्या यह काम करने का कोई तरीका है? – seaguest

उत्तर

4

यह संभव नहीं है, आप रिश्ते में संपत्ति नहीं जोड़ सकते हैं। यदि आपको जॉइन टेबल में संपत्ति तक पहुंचने की आवश्यकता है, तो वह संपत्ति कुछ इकाई से संबंधित है और नतीजतन आपको तीसरी इकाई की आवश्यकता है।

3

यह संभव है।

आपको केवल एक-से-कई और कई-एक मैपिंग के स्पष्ट संयोजन के साथ कई-से-कई मैपिंग को प्रतिस्थापित करने की आवश्यकता है, जो कि दो प्राथमिक इकाइयों (छात्र और आपके उदाहरण में पाठ्यक्रम)।

कृपया कई रिश्ते (व्यापारी और सेवाओं) में कई के साथ विवरण here

0

संस्थाओं पढ़ें। यह तीसरी इकाई का उपयोग करके प्राप्त किया जा सकता है: -

@Entity 
@Table(name = "merchant") 
public class Merchant implements java.io.Serializable { 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.merchant",targetEntity = MerchantService.class) 
    private Set<MerchantService> merchantServices = new HashSet<>(); 
} 

@Entity 
@Table(name = "merchant_service") 
@AssociationOverrides({ 
     @AssociationOverride(name = "pk.merchant", 
      joinColumns = @JoinColumn(name = "merchant_id")), 
     @AssociationOverride(name = "pk.service", 
      joinColumns = @JoinColumn(name = "service_id")) }) 
public class MerchantService implements java.io.Serializable { 

    @EmbeddedId 
    private MerchantServiceId pk = new MerchantServiceId(); 

    private boolean isActive; 

    public MerchantServiceId getPk() { 
     return pk; 
    } 

    public void setPk(MerchantServiceId pk) { 
     this.pk = pk; 
    } 

    @Transient 
    public Service getService() { 
     return getPk().getService(); 
    } 


    @Transient 
    public Merchant getMerchant() { 
     return getPk().getMerchant(); 
    } 


    public boolean isActive() { 
     return isActive; 
    } 

    public void setActive(boolean isActive) { 
     this.isActive = isActive; 
    } 

} 

@Embeddable 
public class MerchantServiceId implements java.io.Serializable { 

    private Merchant merchant; 
    private Service service; 

    @ManyToOne 
    public Merchant getMerchant() { 
     return merchant; 
    } 

    @ManyToOne 
    public Service getService() { 
     return service; 
    } 

} 

@Entity 
@Table(name = "service") 
public class Service implements java.io.Serializable { 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.service",targetEntity = MerchantService.class) 
    private Set<MerchantService> merchantServices = new HashSet<>(); 

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