簡體   English   中英

Hibernate Cascade DELETE OneToMany 不起作用。 違反參照完整性約束

[英]Hibernate Cascade DELETE OneToMany does not work. Referential integrity constraint violation

我有一個包含劇集列表的 Webtoon 類。 這是一種單向關系。

@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@CollectionTable(name= "list_of_episodes")
List<Episode> listOfEpisodes = new ArrayList<>();

在我的單元測試中,我創建了一個 Webtoon 對象,然后在 listOfEpisodes 列表中添加了一個劇集。 當我嘗試使用劇集存儲庫刪除劇集時

this.episodeRepo.delete(episode);

我收到錯誤:

違反德contrainte: “FK50GHKTDAXMN68TBU6KAYVUX9S:PUBLIC.LIST_OF_EPISODES外鍵(LIST_OF_EPISODES_ID)參考PUBLIC.EPISODE(ID)(3)” 參照完整性約束違規:“FK50GHKTDAXMN68TBU6KAYVUX9S:PUBLIC.LIST_OF_EPISODES外鍵(LIST_OF_EPISODES_ID)參考PUBLIC.EPISODE(ID)( 3)"; SQL 語句:從情節中刪除,其中 id=? [23503-200]

為什么 hibernate 不能刪除這個對象並更新 Webtoon 類中的列表?

嘗試將 FetchType 從 EAGER 更改為 LAZY

引用完整性是數據的一種屬性,表明其所有引用都是有效的。 在關系數據庫的上下文中,它要求如果關系(表)的一個屬性(列)的值引用另一個屬性的值(在相同或不同的關系中),則引用的值必須存在。

從錯誤PUBLIC.LIST_OF_EPISODES FOREIGN KEY(LIST_OF_EPISODES_ID) REFERENCES PUBLIC.EPISODE(ID) 中,您可以清楚地看到 PUBLIC.EPISODE(ID) 被引用為 PUBLIC.LIST_OF_EPISODES 表中的外鍵,因此除非您刪除父項,否則您無法刪除父項子元素。

嘗試使用 @JoinColumn 而不是使用 @CollectionTable(name="list_of_episodes")

為了解決這個問題,我首先將單向關系改為雙向關系。 在 Webtoon 中,我有:

@OneToMany(cascade = CascadeType.ALL, mappedBy="webtoon", orphanRemoval = true)
@CollectionTable(name= "list_of_episodes")
List<Episode> listOfEpisodes = new ArrayList<>();

在Episode中,我添加了一個webtoon屬性

@ManyToOne(fetch= FetchType.LAZY)
@JoinColumn(name="webtoon_id")
Webtoon webtoon;

因為,它很懶惰......我無法獲得列表,就像我在使用eager一樣,所以我在我的存儲庫中添加了一個連接選擇。 而且當我刪除時,我有級聯刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM