我正在尝试在两个实体之间建立多对多关系,其中有多种关系类型。
例如,假设我们有一个表“course”,一个表“person”和一个映射表“course_person”。任何给定的课程都可以有教师,评分员和学生,每个都是人员表中的集合。每个人都可以加入不同角色的多门课程。
表“course_person”包含列“course_id”,“person_id”和“type”,其中type是“INSTRUCTOR”,“GRADER”或“STUDENT”。
课程类将有三个不同的Set成员,每个成员列出给定角色的人员。它看起来像这样:
@Entity
@Table(name = "course")
public class Course{
private Set<Person> instructors;
private Set<Person> graders;
private Set<Person> students;
@ManyToMany(
targetEntity=Person.class,
cascade={CascadeType.PERSIST, CascadeType.MERGE}
)
@JoinTable(
name="course_person",
joinColumns=@JoinColumn(name="course_id"),
inverseJoinColumns=@JoinColumn(name="person_id")
)
@WhereJoinTable(clause="type='INSTRUCTORS'")
public Set<Person> getInstructors() {
return this.instructors;
}
@ManyToMany(
targetEntity=Person.class,
cascade={CascadeType.PERSIST, CascadeType.MERGE}
)
@JoinTable(
name="course_person",
joinColumns=@JoinColumn(name="course_id"),
inverseJoinColumns=@JoinColumn(name="person_id")
)
@WhereJoinTable(clause="type='GRADER'")
public Set<Person> getGraders() {
return this.graders;
}
@ManyToMany(
targetEntity=Person.class,
cascade={CascadeType.PERSIST, CascadeType.MERGE}
)
@JoinTable(
name="course_person",
joinColumns=@JoinColumn(name="course_id"),
inverseJoinColumns=@JoinColumn(name="person_id")
)
@WhereJoinTable(clause="type='STUDENT'")
public Set<Person> getStudents() {
return this.students;
}
}
这适用于从数据库中读取数据。但是,它不适用于在map表中创建新条目,因为hibernate不知道要将“type”设置为什么。我需要找到一种方法将每个关系类型的“教师”类型设置为“INSTRUCTOR”等。这可行吗?