我将Spring Boot 2,JPA和Hibernate一起使用。 我有很多孩子的对象。我搜索删除孩子和孩子的孩子...
只有一种关系不能删除
我有这些对象。
public class Spi{
...
@OneToMany(mappedBy = "spi", orphanRemoval = true,cascade = {CascadeType.MERGE, CascadeType.PERSIST})
private List<Asi> asi = new ArrayList<>();
@OneToMany(mappedBy = "spi", orphanRemoval = true,, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
private List<SapI> sapI = new ArrayList<>();
..
}
public class Asi{
...
@OneToMany(mappedBy = "asi", orphanRemoval = true,cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@Audited
private List<Gi> gi = new ArrayList<>();
@ManyToOne
Spi spi;
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "asi_scpi")
private Set<Scpi> scpi = new HashSet<>();
}
public class Gi{
...
@ManyToOne
Asi asi;
}
public class Scpi{
...
@ManyToMany(mappedBy = "scpi")
Set<Asi> asi = new HashSet<>();
}
public class Sapi{
...
@ManyToOne
Spi spi;
}
我搜索保留Spi,但删除了Asi和Sapi。因为我删除了Asi,所以也应该删除Scpi和gi。
@Transactional
public void deleteChilds(Integer spiId){
scpiRepository.deleteBySpiId(spiId);
em.flush();
em.clear();
Optional<Spi> optSpi = repository.findById(spiId);
if (optSpi.isPresent()) {
Spi spi = optSpi.get();
spi.getSpci().clear();
spi.getAsi().clear();
repository.save(spi);
}
}
有一个不能删除的关系是spci。 使用
scpiRepository.deleteBySpiId(spiId);
我看到有两个删除操作,分别为表和联接表完成一个操作,但似乎没有完成