Asignación ManyToMany con clave primaria compuesta y anotación:

Estoy tratando de crear una gran cantidad de relaciones entre el Curso de Estudiante y el Curso de Enseñanza usando la clave primaria compuesta:

mis clases:

@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. } 

Clase de enseñanza:

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

Objetos de colección:

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

Ahora la clave principal:

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

Cuando trato de persistir con el estudiante recibí el siguiente error:

 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 

¿Qué estoy haciendo mal?

Resolví este problema. Asigné Getter en lugar de campo.

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

Si puedes, te sugiero que elimines las claves compuestas. Vale la pena con simples teclas principales que pueden hacer que muchos problemas desaparezcan y simplificar tu código. He utilizado claves compuestas en una base de datos en el pasado porque no tenía la capacidad de modificar el db. Desafortunadamente no tengo el código. Pero recuerdo que tomó un poco de trabajo para que todo funcionara correctamente. Lo siento, no puedo ayudar más.