3

我正在尝试映射一个类似于在 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 和 Semester 生成主键,而不为 Student 和 Course 生成主键?在这种情况下,这没有任何意义。有了这个主键,学生每学期只能参加一门课程。'student_id' 和 'course_id' 应该被定义为主键!这也将匹配 Java 映射定义(键必须是唯一的,但可以将相同的值分配给不同的键)

4

1 回答 1

0

JPA 将这种关系视为学生和学期之间的关系,就像在没有 @MapKeyJoinColumn 的传统 @ManyToMany 中一样,在传统的 @ManyToMany 中不允许重复,并且项目被源/目标 ID 删除,因此 pk/index 是希望在这些上。

为了更好地控制模型,请考虑将 ENROLLMENTS 表映射到 Enrollment Entity。

我可以从 Java 模型中看到您可能希望有所不同,因此请为此记录错误/增强。

于 2012-10-29T14:34:24.183 回答