我正在尝试映射一个HashMap,类似于在JavaDoc中为@MapKeyJoinColumn指定为示例3的HashMap(参见http://www.objectdb.com/api/java/jpa/MapKeyJoinColumn):
@Entity
public class Student {
@Id int studentId;
...
@ManyToMany // students and courses are also many-many
@JoinTable(name="ENROLLMENTS",
joinColumns=@JoinColumn(name="STUDENT"),
inverseJoinColumns=@JoinColumn(name="SEMESTER"))
@MapKeyJoinColumn(name="COURSE")
Map<Course, Semester> enrollment;
...
}
生成的连接表(使用EclipseLink 2.3生成)具有以下布局:
TABLE enrollments (
student_id bigint NOT NULL,
semester_id bigint NOT NULL,
course_id bigint,
CONSTRAINT enrollments_pkey PRIMARY KEY (student_id, semester_id)
)
为什么为学生和学期而不是学生和课程生成主键?在这种情况下,这没有任何意义。使用此主键,学生每学期只能参加一门课程。应将'student_id'和'course_id'定义为主键!这也将匹配Java映射定义(键必须是唯一的,但可以将相同的值分配给不同的键)
答案 0 :(得分:0)
JPA将关系视为学生和学期之间的关系,就像传统的@ManyToMany没有@MapKeyJoinColumn一样,并且在传统的@ManyToMany中不允许重复,并且项目被源/目标ID删除,所以pk / index希望是这些。
为了更好地控制模型,请考虑将ENROLLMENTS表映射到注册实体。
我可以从Java模型中看到您可能希望与众不同,所以请为此记录一个错误/增强功能。