[英]Orphan and child handling in JPA/Hibernate
我的表結構如下。 我有銷售,其中包含一批或多批貨物。 每批貨物由一個或多個批次組成。 我試圖實現的是,當我保存已從中刪除發貨的銷售時,發貨被刪除並且批次被孤立。
我有以下課程(為簡潔起見縮短):
@Entity
public class Sale {
@Id
String orderNumber;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "sale")
List<Shipment> shipments;
}
@Entity
public class Shipment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "sale_order_number")
Sale sale;
@OneToMany
List<Batch> batches;
}
@Entity
public class Batch {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
@ManyToOne
Shipment shipment;
}
我的問題是,當 JPA(或 hibernate?)嘗試刪除孤立的貨件時,它只是將貨件的所有屬性設置為 NULL,除了 id。
通常不允許使用空值,但我重新配置了表只是為了查看它在數據庫中嘗試做什么。
根據請求,這是我之前的數據庫、預期結果和實際結果。 我在 shipment 表中添加了一些屬性來澄清一些問題:
sale
order_number
1
shipment
id sale_order_number amount ref
1 1 54 'foo'
2 1 62 'bar'
batch
id shipment_id
1 1
1 2
2 1
2 1
2 2
然后我發布銷售更新,列表不包含 id 2 的貨件,這是我保存時所期望的:
sale
order_number
1
shipment
id sale_order_number amount ref
1 1 54 'foo'
batch
id shipment_id
1 1
1 NULL
2 1
2 1
2 NULL
實際的 output。我違反了約束,所以我允許屬性為 NULL 只是為了看看發生了什么。 之后查詢成功了,但結果讓我感到困惑:
sale
order_number
1
shipment
id sale_order_number amount ref
1 1 54 'foo'
2 NULL NULL NULL
batch
id shipment_id
1 1
1 NULL
2 1
2 1
2 NULL
我認為您還應該像那樣將孤立刪除標志添加到批處理列表中
@Entity
public class Shipment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
@ManyToOne
@JoinColumn(name = "sale_order_number")
Sale sale;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "shipment")
List<Batch> batches;
}
如果您使用腳本或任何遷移框架創建數據庫以將屬性“OnDelete = Cascade”添加到外鍵,這也很好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.