簡體   English   中英

無法刪除具有OneToMany關系的記錄

[英]Cannot delete a record with OneToMany relation

當我刪除表中的記錄時,應在另一個表中刪除相關記錄。 但我接受了:

java.sql.BatchUpdateException:批處理項0更新child_table set parent_table_id = null其中parent_table_id = 63已中止

針對以下設置拋出上述異常:

@OneToMany(cascade = javax.persistence.CascadeType.ALL, targetEntity = ChildTable.class)
@JoinColumn(name = "parent_table_id")
@org.hibernate.annotations.Fetch(FetchMode.SUBSELECT)
public List<ChildTable> getTables() {
    return tables;
}

如果我沒有弄錯,使用這樣的注釋,當在ParentTable中刪除記錄時,應該在Child 1中刪除相應的關系。 它會在完全刪除之前嘗試變為“null”(因為相應的記錄不再存在)。 此id列為“not null”。 當我將其設為“null”(僅用於測試此案例)時,一切正常。

你能幫我理解這背后的真正問題是什么嗎?

先感謝您。

我通常不使用注釋。 我更喜歡hbm映射文件,所以我可以用hbm映射告訴你一些可能的解決方案。 :)我認為你需要在父母一對多關系中添加inverse = true。 始終在您的父集合中放置inverse = true 對於等於inverse = true的注釋,請看這個

如果這不起作用,我知道這不是一個好的解決方案,你可以嘗試使用not-found =“ignore”或@NotFound(action = NotFoundAction.IGNORE)在父對話中的一對多關系。 最終,它與對數據庫中的外鍵列使用not-null = false具有相同的效果。

其中一位回應者給出了正確答案,但他刪除了它。 我不得不使用hibernate Cascade注釋而不是JPA注釋。 它對我不起作用,因為問題比僅使用JPA和hibernate注釋要深一些。 ChildTable的Mapper類具有int類型的parent_table_id,而不是id字段被映射到的ParentTable類類型。所以我將其更改為:

@Entity
@Table(name = "child_table")
public class ChildTable {

private int id;
private int parent_table_id;
...

@Entity
@Table(name = "child_table")
public class ChildTable {

private int id;
private ParentTable parent_table;
...

肯定會進行一些額外的更改(與此相關)並且刪除開始按預期工作。

因此,如果在刪除一對多關系中的實體期間出現相應的錯誤,並且注釋用法一切正確,請檢查類型,您的字段是mapper-classes :)

暫無
暫無

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

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