Hibernate无法删除级联中一对一的映射实体

问题描述 投票:0回答:1

我有两个实体一对一映射:

实体1:

@OneToOne(mappedBy = "entity2", cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}, orphanRemoval = true, fetch = FetchType.EAGER, optional = false)
@Fetch(value = FetchMode.JOIN)
Entity2 entity2;

实体2:

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "entity1_id", nullable = false, referencedColumnName = "id")
private Entity1 entity1;

Entity1 本身映射到 Entity1 中定义的另一个实体 SuperEntity,如下所示:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "superentity_id", referencedColumnName = "id", nullable = false)
private SuperEntity superEntity;

我使用

deleteById
方法删除 SuperEntity。所有映射的 Entity1 按预期删除,但对于每个 Entity2,我收到以下错误:

HHH000114: Handling transient entity in delete processing

org.springframework.dao.InvalidDataAccessApiUsageException: Removing a detached instance

此行为的原因是什么?我该如何解决? 我正在使用 Spring Boot 3.1.2 和 Hibernate 6.2.6。

java hibernate spring-data-jpa
1个回答
0
投票

您遇到此行为的原因是由于在 Entity1 和 Entity2 之间的 @OneToOne 映射上设置了孤立删除级联选项。当您删除 SuperEntity 时,Hibernate 会尝试将删除级联到关联的 Entity1 实例。但是,由于孤立删除级联选项,Hibernate 也会尝试删除关联的 Entity2 实例。

错误消息“HHH000114:在删除处理中处理瞬态实体”表示 Hibernate 正在尝试删除瞬态(即分离)实体,在本例中为 Entity2。

您可以从 Entity1 中的 @OneToOne 映射中删除 orphanRemoval = true 选项。

© www.soinside.com 2019 - 2024. All rights reserved.