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);