3

@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 マップ定義とも一致します (キーは一意である必要がありますが、同じ値が異なるキーに割り当てられている可能性があります)。

4

1 に答える 1

0

JPAは、@ MapKeyJoinColumnのない従来の@ManyToManyのように、関係をStudentとSemesterの間にあると見なし、従来の@ManyToManyの複製は許可されず、アイテムはソース/ターゲットIDによって削除されるため、pk/indexは次のようになります。これらになりたい。

モデルをより細かく制御するには、代わりにENROLLMENTSテーブルを登録エンティティにマッピングすることを検討してください。

Javaモデルから、どのように異なるものを望むか​​がわかります。そのため、バグ/拡張機能をログに記録してください。

于 2012-10-29T14:34:24.183 に答える