【发布时间】:2016-05-24 16:06:43
【问题描述】:
我正在尝试对以下内容进行建模:
学生可以参加考试并获得成绩。
应该可以将同一个成绩实体分配给多个学生。
成绩存储在地图中(在“考试”类中),其注释如下:
@ManyToMany
@MapKeyClass(value = Person.class)
@JoinTable(name = "t1")
private Map<Person, Grade> grades;
JPA 创建以下连接表:
T1:
EXAM_ID: stores the id of the exam, is part of the primary key
GRADES_ID: stores the id of the grade, is part of the primary key
GRADES_KEY: stores the id of the student, is not part of the primary key
但是,我期望的表会有一个包含学生和考试的主键。
我现在面临的问题是当我尝试以下操作时:
grades.put(student1, grade1);
grades.put(student2, grade1);
...我会收到一个异常,告诉我我违反了数据库约束。
如何正确持久化这张地图?
我使用 eclipselink 2.6.0 作为 JPA 提供程序。该应用程序在带有 derby 数据库的 glassfish 服务器上运行。
感谢您的阅读,祝您有愉快的一天:)
更新:
这些是用于创建数据库的 SQL 查询、eclipselink 调用:
...
CREATE TABLE EXAM_GRADE (Exam_ID BIGINT NOT NULL, grades_ID BIGINT NOT NULL, grades_KEY BIGINT, PRIMARY KEY (Exam_ID, grades_ID))
...
ALTER TABLE EXAM_GRADE ADD CONSTRAINT EXAMGRADEgrades_ID FOREIGN KEY (grades_ID) REFERENCES GRADE (ID)
ALTER TABLE EXAM_GRADE ADD CONSTRAINT EXAMGRADEgradesKEY FOREIGN KEY (grades_KEY) REFERENCES PERSON (ID)
ALTER TABLE EXAM_GRADE ADD CONSTRAINT EXAM_GRADE_Exam_ID FOREIGN KEY (Exam_ID) REFERENCES EXAM (ID)
...
【问题讨论】:
-
你有没有设法解决你的问题?我在地图/主键/等方面遇到了完全相同的问题......
-
嗨,Thomas,我不记得具体是怎么做的了,但我通过重组数据解决了这个问题。
-
嗨 Niko,感谢您的回复,但不是我想听到的 :)
标签: java sql jpa dictionary eclipselink