我有两个实体一对一映射:
实体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。
您遇到此行为的原因是由于在 Entity1 和 Entity2 之间的 @OneToOne 映射上设置了孤立删除级联选项。当您删除 SuperEntity 时,Hibernate 会尝试将删除级联到关联的 Entity1 实例。但是,由于孤立删除级联选项,Hibernate 也会尝试删除关联的 Entity2 实例。
错误消息“HHH000114:在删除处理中处理瞬态实体”表示 Hibernate 正在尝试删除瞬态(即分离)实体,在本例中为 Entity2。
您可以从 Entity1 中的 @OneToOne 映射中删除 orphanRemoval = true 选项。