@MapKeyJoinColumn の JavaDoc で例 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 と Course ではなく、Student と Semester の主キーが生成されるのはなぜですか? この場合、これは意味がありません。この主キーを使用すると、学生は学期ごとに 1 つのコースにのみ参加できます。'student_id' と 'course_id' は主キーとして定義する必要があります! これは、Java マップ定義とも一致します (キーは一意である必要がありますが、同じ値が異なるキーに割り当てられている可能性があります)。