我有一个具有很多关系的实体,即使我尝试删除它,我仍然会在数据库中找到它。
@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> {
}
还有另一种方法吗?还是推荐的方法?
答案 0 :(得分:1)
除了带有objectC
的关联之外,您所有的关联都具有cascade=ALL
。因此,如果删除主要对象,则objectAList
,objectBList
等中的对象也将被删除。将列表设置为空 prevents 休眠以将删除级联到这些其他对象。不要那样做。
objectC与OneToOne链接,所有者端是C。您想让C停留在那儿。但是由于您要删除它,它不可能再引用主对象。因此,您需要删除C和主要对象之间的链接。
所以您需要
mainObject.getObjectC().setMainObject(null);
mainObjectRepository.delete(mainObject);
当然,这还假定链接的实体中也配置了正确的级联,并且它们本身未被未被删除的其他实体引用。