ManyToMany mit zusammengesetztem Primärschlüssel und Annotation zuordnen:

Ich versuche, mit dem Composite-Primärschlüssel viele Situationen zwischen Student und Teaching Course zu erstellen:

meine classn:

@Entity @Table(name="Student_mtm_cId") public class Student { private String id; private Set teachingClasses = new HashSet(); @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.student") public Set getTeachingClasses() { return teachingClasses; } public void setTeachingClasses(Set 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. } 

Lehrklasse:

 @Entity @Table(name="TechingClass_MTM") public class TeachingClass { private String id; private String name; private String description; private Set teachingClasses = new HashSet(); 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 getTeachingClasses() { return teachingClasses; } public void setTeachingClasses(Set 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; } } 

Sammlungsobjekte:

 @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); } } 

Jetzt der Primärschlüssel:

 @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() {} } 

Wenn ich versuche, Student zu persistieren, erhalte ich folgenden Fehler:

 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.(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 

Was mache ich falsch?

Ich habe dieses Problem getriggers. Ich habe Getter anstelle von field abgebildet.

 public class StudentTClass { //@EmbeddedId private StudentTClassPK pk = new StudentTClassPK(); @EmbeddedId public StudentTClassPK getPk() { return pk; } 

Wenn Sie können, würde ich ernsthaft vorschlagen, die zusammengesetzten Schlüssel zu entfernen. Mit einfachen Primärschlüsseln können Sie viele Probleme lösen und Ihren Code vereinfachen. Ich habe in der Vergangenheit zusammengesetzte Schlüssel in einer database verwendet, weil ich die database nicht ändern konnte. Leider habe ich den Code nicht. Aber ich erinnere mich, dass es etwas Arbeit gekostet hat, damit alles richtig funktionierte. Entschuldigung, ich kann nicht mehr helfen.