簡體   English   中英

JPA/Hibernate 中的孤兒和兒童處理

[英]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.

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