java - 将 Spring Boot 从 2.1.5 升级到 2.1.6 时出现问题,似乎没有正确/以正确的顺序删除数据
问题描述
我正在尝试将 Spring Boot 从 2.1.5 升级到 2.1.6(关键是要升级到 2.2x,但这是我发现问题的地方)
在我们的一项测试中尝试删除 subjectType 类型的实体时出现以下异常:
Detail: Key (id)=(5cd21b13-5dea-4384-9589-3a4d1ab4dfea) is still referenced from table "metric".
这似乎很清楚,对吧?我正在尝试删除仍然引用它的东西。
但是,代码总是可以正常工作。就这么简单:
List<Metric> metrics = metricRepo.findBySubjectTypeId(id);
metricRepo.deleteAll(metrics);
subjectTypeRepo.delete(subjectType);
entityManager.flush();
... //some code that removes data from other systems now that this part succeeded
异常发生在刷新时,id 是要删除的 subjectType 的 id。
Metric 对 subjectType 有一个相当标准的参考,如下所示:
@Entity
public class Metric {
@JoinColumn(name = "subject_type_id", nullable = false, foreignKey = @ForeignKey(name = "fk_subject_type"))
@ManyToOne
private SubjectType subjectType;
}
我们不使用级联删除,因为其他系统中的数据需要删除。但是,在实际删除 subjectType 本身之前手动删除引用 subjectType 的对象应该适用于简单的非并发情况。
我试图查看 2.1.5 和 2.1.6 之间依赖关系的变化,但无法挑选出任何明显的候选者,而且除了验证器之外,Hibernate 似乎没有升级。所以我真的很茫然,这里突然发生了什么变化,是什么导致了这个问题。该问题仍然存在于(当前最新的)2.2.1 版本中。
解决方案
推荐阅读
- javascript - 谷歌地图 - 在 MySQL 和 PHP 中搜索 POINTS 圈
- django - DJANGO:如何在模板中使用“核心”URL
- r - 创建极坐标热图,但留下一个扇形空间来注释每个环使用 R 表示的内容
- firebase - 升级到 Firebase Crashlytics SDK 时未收到 Firebase 崩溃报告
- memory - 在 C64 上寻找类似汇编器的旧机器人语言
- php - Laravel 登录列处理
- python - 尝试运行线程时出现 NameError
- java - 将 Hibernate 从 3 迁移到 4 后的事务问题
- flutter - 如何知道手机操作系统 IOS 还是 android Flutter
- verilog - 尝试将我的 verilog 代码从 modelsim 转移到 quartus 时出现很多错误