JPA:如何删除具有许多双向关系的实体

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

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

@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,我发现我没有打破一个使我试图删除的MainObject保持生命的关系。

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

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

并且objectCRepository是:

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

}

还有另一种方法吗?还是建议的方法?

hibernate jpa
1个回答
1
投票

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

objectC与OneToOne链接,所有者端是C。您希望C留在那儿。但是由于您要删除它,它不可能再引用主对象。因此,您需要删除C和主要对象之间的链接。

所以您需要

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

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

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