2011-06-19 23 views
15

मैं समग्र प्राथमिक कुंजी का उपयोग कर छात्र और शिक्षण पाठ्यक्रम के बीच manytomany realation बनाने के लिए कोशिश कर रहा हूँ:मानचित्रण ManyToMany:

मेरी कक्षाएं:

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

    private String id; 
    private Set<StudentTClass> teachingClasses = new HashSet<StudentTClass>(); 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.student") 
    public Set<StudentTClass> getTeachingClasses() { 
     return teachingClasses; 
    } 
    public void setTeachingClasses(Set<StudentTClass> teachingClasses) { 
     this.teachingClasses = teachingClasses; 
    } 

    public void addStudentToClass(TeachingClass teachingClass){ 
     StudentTClass studentTClass = new StudentTClass(); 
     studentTClass.setStudent(this); 
     studentTClass.setTeachingClass(teachingClass); 
     teachingClasses.add(studentTClass); 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Id @GeneratedValue(generator="system-uuid") 
    @GenericGenerator(name="system-uuid", strategy = "uuid") 
    @Column(name = "student_id", nullable = false) 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    //all other setters and getters and isequal/hashCode omitted. 
} 

TeachingClass:

@Entity 
@Table(name="TechingClass_MTM") 
public class TeachingClass { 

    private String id; 
    private String name; 
    private String description; 
    private Set<StudentTClass> teachingClasses = new HashSet<StudentTClass>(); 

    public TeachingClass(){} 

    public TeachingClass(String name, String description) { 
     super(); 
     this.name = name; 
     this.description = description; 
    } 

    public void addStudentToClass(Student student){ 
     StudentTClass studentTClass = new StudentTClass(); 
     studentTClass.setStudent(student); 
     studentTClass.setTeachingClass(this); 
     teachingClasses.add(studentTClass); 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.teachingClass") 
    public Set<StudentTClass> getTeachingClasses() { 
     return teachingClasses; 
    } 

    public void setTeachingClasses(Set<StudentTClass> teachingClasses) { 
     this.teachingClasses = teachingClasses; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    @Id @GeneratedValue(generator="system-uuid") 
    @GenericGenerator(name="system-uuid", strategy = "uuid")  
    @Column(name = "teachingClass_id", nullable = false) 
    public String getId() { 
     return id; 
    } 

public void setId(String id) { 
     this.id = id; 
    } 
} 

संग्रह ऑब्जेक्ट्स:

@Entity 
@Table(name = "student_TClass_MTM") 
@AssociationOverrides({ 
@AssociationOverride(name = "pk.student", joinColumns = @JoinColumn(name = "student_id")), 
@AssociationOverride(name = "pk.teachingClass", joinColumns = @JoinColumn(name = "teachingClass_id")) 
     }) 
public class StudentTClass { 

    @EmbeddedId 
    private StudentTClassPK pk = new StudentTClassPK(); 

    public StudentTClassPK getPk() { 
     return pk; 
    } 

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

    public StudentTClass() {} 

    @Transient 
    public Student getStudent(){ 
    return this.pk.getStudent(); 
    } 

    @Transient 
    public TeachingClass getTeachingClass(){ 
    return this.pk.getTeachingClass();  
    } 

    public void setStudent(Student student){ 
     this.pk.setStudent(student); 
    } 

    public void setTeachingClass(TeachingClass teachingClass){ 
     this.pk.setTeachingClass(teachingClass);  
    } 

    } 

अब प्राथमिक कुंजी:

@Embeddable 
public class StudentTClassPK implements Serializable{ 

    private static final long serialVersionUID = -7261887879839337877L; 
    private Student student; 
    private TeachingClass teachingClass; 

    @ManyToOne 
    public Student getStudent() { 
     return student; 
    } 
    public void setStudent(Student student) { 
     this.student = student; 
    } 

    @ManyToOne 
    public TeachingClass getTeachingClass() { 
     return teachingClass; 
    } 
    public void setTeachingClass(TeachingClass teachingClass) { 
     this.teachingClass = teachingClass; 
    } 
    public StudentTClassPK(Student student, TeachingClass teachingClass) { 
     this.student = student; 
     this.teachingClass = teachingClass; 
    } 
    public StudentTClassPK() {} 


} 

जब मैं छात्र मैं निम्नलिखित त्रुटि मिली लागू करने के लिए कोशिश कर रहा हूँ:

Caused by: org.hibernate.MappingException: Could not determine type for: com.vanilla.objects.Student, at table: student_TClass_MTM, for columns: [org.hibernate.mapping.Column(student)] 
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306) 
    at org.hibernate.tuple.PropertyFactory.buildStandardProperty(PropertyFactory.java:143) 
    at org.hibernate.tuple.component.ComponentMetamodel.<init>(ComponentMetamodel.java:68) 
    at org.hibernate.mapping.Component.buildType(Component.java:184) 
    at org.hibernate.mapping.Component.getType(Component.java:177) 
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:290) 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:236) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1362) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:855) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:774) 
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) 
    ... 51 more 

क्या मैं गलत कर रहा हूँ?

उत्तर

13

मैंने इस मुद्दे को हल किया। मैंने मैदान के बजाय गेटर को मैप किया।

public class StudentTClass { 

    //@EmbeddedId 
    private StudentTClassPK pk = new StudentTClassPK(); 

    @EmbeddedId 
    public StudentTClassPK getPk() { 
     return pk; 
    } 
+0

यह काम किया! मुझे इसे एंबेडेड आईडी टैग के साथ-साथ एंबेबल के रूप में टैग की गई कक्षा में दोनों कक्षाओं में करना था। –

5

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

+2

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

+2

मैं सहमत हूं, ऐसे मामले हैं जहां समग्र कुंजी वैध रूप से उपयोगी हैं। – aroth

+2

@ danny.lesnik संयोजन विशिष्टता को एक अद्वितीय सूचकांक के माध्यम से गारंटी दी जा सकती है। जेपीए 2.1 कार्यान्वयन-अज्ञेयवादी वाक्यविन्यास प्रदान करता है। –

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