Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何删除具有许多双向关系的enity_Hibernate_Jpa - Fatal编程技术网

Hibernate 如何删除具有许多双向关系的enity

Hibernate 如何删除具有许多双向关系的enity,hibernate,jpa,Hibernate,Jpa,我有一个有很多关系的实体,即使我试图删除它,我也会在数据库中找到它 @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class FatherObject { @Id private String id; @OneToOne(mappedBy = "fatherObject", cascade = CascadeType.ALL, fetch = Fetch

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

@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> {

}
[编辑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> {

}
@存储库
公共接口ObjectCRepository扩展了JpaRepository{
}

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

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

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

所以你需要

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

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

您希望所有其他对象(A、B、C等)变成什么?我希望删除所有其他对象,除了objectC。好的,我已经做了,但似乎不起作用。在我将main对象设置为null之后,我必须保存对ObjectC的更改吗?我已经在ObjectC内部将main对象设置为null,然后通过“objectCRepository.save(ObjectC)”保存了对ObjectC的更改,它工作得很好。我不知道为什么它不起作用。你应该在交易中做这一切,就像你对JPA所做的一切。你这是什么意思?我在一个带有服务和事务注释的类中的单个方法中完成所有这些。这就是我的意思。如果对象是托管对象(即从该事务中的数据库加载),则不需要保存objectC。
ObjectC objectC = mainIbject.getObjectC();
objectC.setMainObject(null);
objectCRepository.save(objectC);