【发布时间】:2018-01-15 15:26:11
【问题描述】:
我有这样的课程Subject,
@Entity
@IdClass(SubjectId.class)
@Data
public class Subject {
@Id
private String name;
@ManyToOne
@JsonBackReference
@Id
private Teacher teacher;
@OneToMany(mappedBy = "student")
private List<StudentSubject> students;
}
它的复合 Id 是在 SubjectId 类中定义的,
public class SubjectId implements Serializable{
private String name;
private Teacher teacher;
public SubjectId(String name, Teacher teacher) {
this.name = name;
this.teacher = teacher;
}
SubjectId(){}
}
编译时出现错误
org.hibernate.MappingException:集合外键映射的列数错误:com.example.Subject.students 类型:component[name,teacher]
虽然这将错误指向学生元素,但在我删除了自动生成的主题 ID 并将其替换为姓名和教师的组合后发生了错误。
无论如何,students 元素被映射到 StudentSubject 类中,
@Entity
@IdClass(StudentSubjectId.class)
public @Data
class StudentSubject {
String studentId;
@ManyToOne
@Id
private Subject subject;
@ManyToOne
@Id
private Student student;
【问题讨论】:
-
我从来没有做过多键值作为外键,但如果你在
subject中的@JoinColumns上使用@JoinColumns可能会起作用。 -
@coladict 成功了!但我不明白为什么这是 StudentSubject 实体的问题,而另一个实体(此处未提及)可以将两列都添加为外键。
-
可能是因为
Subject类有一个多键id,所以Hibernate不知道如何递归映射列。