我想模擬以下內容:
學生可以參加考試並獲得成績。
應該可以將同一年級實體分配給多個學生。
的等級存儲在地圖(在「考試」類),這是註釋像這裏面:JPA:從實體到實體的hashmap在連接表中獲取錯誤的主鍵
@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
但表我預計會有一個主要關鍵的學生和考試。
問題IM現在面臨的是,當我嘗試以下方法:
grades.put(student1, grade1);
grades.put(student2, grade1);
...我會得到一個異常告訴我,即時通訊違反數據庫約束。
我該如何正確堅持這張地圖?
我使用eclipselink 2.6.0作爲JPA提供程序。該應用程序在具有derby數據庫的glassfish服務器上運行。
謝謝您的閱讀,並有一個愉快的一天:)
UPDATE:
這些都是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)
...
我希望能夠分配同檔次多個學生,這就是爲什麼使用多對多IM。這就是奇怪的主鍵約束導致問題的原因。我可以問哪個JPA提供程序和您使用的是哪個版本? – Niko
我正在使用wildfly 9,所以這是Hibernate Core {4.3.10.Final}。 –
查看我的更新。我淡化了我的第一個答案,並嘗試了EclipseLink上的所有內容,所以我明白了爲什麼會遇到麻煩。 –