gpt4 book ai didi

java - JPA/Hibernate 中的孤儿和 child 处理

转载 作者:行者123 更新时间:2023-12-01 16:20:30 25 4
gpt4 key购买 nike

我的表结构如下。我有销售,其中包含一件或多件发货。每批 cargo 由一批或多批组成。我试图实现的是,当我保存已删除发货的销售时,发货将被删除,并且批处理将被孤立。

我有以下类(class)(为简洁起见,已缩短):

@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?)尝试删除孤立的货件时,它只是将除 id 之外的货件的所有属性设置为 NULL。

通常不允许空值,但我重新配置了表只是为了看看它试图在数据库中执行什么操作。

根据请求,这是我之前的数据库、预期结果和实际结果。我在发货表中添加了一些属性来澄清一些问题:

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

实际输出。我遇到了约束违规,因此我允许属性为 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”添加到外键,这也是很好的

关于java - JPA/Hibernate 中的孤儿和 child 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62298240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com