2017-05-24 135 views
0

我想確保我知道我在使用hibernate的DB表示&中正在做什麼。@OneToMany關係上的外鍵約束

我的項目管理工具允許我的用戶創建一個由Phase(s)組成的Project

我不希望創建一個鏈接表,並在我的實體進行像這樣:

ProjectEntity

@OneToMany(mappedBy = "id") 
private Set<PhaseEntity> phases = new HashSet<>(0); 

和我PhaseEntity

@NotNull 
@ManyToOne(targetEntity = ProjectEntity.class) 
private ProjectEntity project; 

填滿後我的PhaseEntity並通過我保存DAO

phaseDao.save(phaseEntity);

我收到以下錯誤:

ERROR: insert or update on table "phase" violates foreign key constraint "fk8x1x98c4hq4ps0d30y6nxe90u" Detail: Key (phase_id)=(1820) is not present in table "project".

的方式我認爲,推動包含特定ProjectEntity到我的數據庫應該創造1項和更新另外一個階段,第一個應該是我phase條目,並且後者應該是project的更新,爲其Set添加一個階段。

我是否必須明確地將我的階段保存在我的project表中? 你喲看到我的推理有什麼缺陷嗎?

回答

0

只是分享知識! 「

」一個由階段組成的項目「 因此,如果要在」階段「表中插入一個階段,則需要在Project表中具有相同'class'列值的角色作爲階段表中新插入行的「類」列值。

外鍵是引用另一個表的列(通常是主鍵)的一列(或多列)。外鍵的目的是確保數據的參照完整性。換句話說,只允許出現在數據庫中的值。

我們有兩個表格,一個包含所有項目的項目表格和一個包含所有階段的階段表格。一個由階段組成的項目。爲了執行這個邏輯,我們在Phase表上放置一個外鍵,讓它引用Project表的主鍵。這樣,我們可以確保階段表中的所有階段都與階段表中的項目相關聯。換句話說,階段表不能包含關於不在項目表中的項目的信息。