如何删除具有许多双向关系的元素



我有一个有很多关系的实体,即使我尝试删除它,我也会在数据库中找到它。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class FatherObject {
@Id
private String id;
@OneToOne(mappedBy = "fatherObject", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false, orphanRemoval = true)
private ObjectX objectX;
}

@Entity
public class MainObject extends FatherObject {
private String attr1;
@OneToMany(mappedBy = "mainObject", cascade = CascadeType.ALL)
private List<ObjectA> objectAList = new ArrayList<>();
@OneToMany(mappedBy = "mainObject", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ObjectB> objectBList = new ArrayList<>();
@OneToOne
@JoinColumn(name="object_c_id")
private ObjectC objectC;
@OneToMany(mappedBy="mainObject", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<ObjectD> objectDList;
@OneToMany(mappedBy="mainObject", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ObjectE> objectEList = new ArrayList<>();

@OneToMany(mappedBy="mainObject", cascade = CascadeType.ALL)
@JsonIgnore
private List<ObjectF> objectFList = new ArrayList<>();

}

public interface MainObjectRepository extends JpaRepository<MainObject, String> {
}

我尝试删除的对象是 MaibObject 类型,如您所见,它与其他实体有许多关系。这些实体与其他实体有其他的相关性。

我已经尝试了一切,但没有任何效果。我尝试将所有属性设置为 null 并保存然后删除对象(因为据我了解,orphanRemoval=true 会自动删除父级不再指向的所有子项(。我试图通过 id 删除对象,按对象删除对象。什么都没用。我不知道删除这种大小的实体的建议过程是什么。知道吗?

这是我使用的最后一种方法。我知道这是错的,但我不知道还能做什么:

@Override
public void deleteById(String mainObjectId){
MainObject mainObject = getById(mainObjectId);
mainObjectId.setObjectA(null);
mainObjectId.setObjectB(null);
mainObjectId.setObjectC(null);
mainObjectId.setObjectD(null);
mainObjectId.setObjectE(null);
mainObjectId.setObjectF(null);
mainObjectRepository.save(shop);
mainObjectRepository.deleteById(shopId);
}

[编辑1]

我希望所有其他对象都与父对象一起删除,除了我希望它保持不变的 objectC。

[编辑2]

多亏了@JB Nizet,我发现我没有破坏一段关系,这种关系使我试图删除的主对象保持活力。

通过将 ObjectC 中的 MainObject 属性设置为 null,然后保存更改,将删除 mainObject 及其所有属性。

ObjectC objectC = mainIbject.getObjectC();
objectC.setMainObject(null);
objectCRepository.save(objectC);

而对象是:

@Repository
public interface ObjectCRepository extends JpaRepository<ObjectC, Long> {
}

有没有其他方法可以做到这一点,或者这是推荐的方法?

除了objectC的关联之外,您的所有关联都cascade=ALL。因此,如果删除主对象,则objectAListobjectBList等中的对象也将被删除。将列表设置为 null可防止休眠将删除级联到这些其他对象。别这样。

对象C与一对一链接,所有者端是C。你想让C留在那里。但它不可能再引用主对象,因为你想删除它。所以你需要删除 C 和主对象之间的链接。

所以你需要

mainObject.getObjectC().setMainObject(null);
mainObjectRepository.delete(mainObject);

当然,这假设在链接实体中也配置了适当的级联,并且它们本身不会被未删除的其他实体引用。

最新更新