JPA 2:映射映射因重复值而失败

时间:2012-10-26 09:20:16

标签: java jpa orm eclipselink

我正在尝试映射一个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映射定义(键必须是唯一的,但可以将相同的值分配给不同的键)

1 个答案:

答案 0 :(得分:0)

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

为了更好地控制模型,请考虑将ENROLLMENTS表映射到注册实体。

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

相关问题