繁体   English   中英

OneToMany ManyToOne使用Hibernate删除子对象

[英]OneToMany ManyToOne removing child object with Hibernate

我正在使用Spring Boot和Hibernate。 假设我们有两个实体:

@Entity
public class A{
    @OneToMany(mappedBy = "objectA",fetch = FetchType.EAGER,cascade = CascadeType.ALL,orphanRemoval=true)
    private Set<B> objectSet = new HashSet<>();
}
@Entity
public class B{
    @ManyToOne
    private A objectA;
}

我们有两种跨界方法;

deleteB_X(int idB){
    entityManager.remove(entityManager.find(idB,B.class));
}
deleteB_Y(int idB){
    B obj=entityManager.find(idB,B.class);
    obj.getObjectA().getObjectSet().remove(obj);
}

我的理解(如果我错了,请纠正我):

  1. 我们有orphanRemoval=true所以deleteB_Y(int)将起作用。
  2. 通过设置mappedBy参数,我们可以说类A是关系的“拥有站点”。
  3. 当我们持久/更新/合并/删除类A时使用CascadeType(然后它在子属性objectSet上调用持久/更新/合并/删除)。 我想我们可以说这可以保护我免受最终以B对象而不是A类为对象的情况(除非我们手动添加一些B objs)。

据我了解,CascadeType不应与orphanRemoval相互干扰,因为CascadeType负责处理我们对A的对象进行“某些处理”的事情(然后递归地对B的对象进行处理)。 这是我一点都不了解的东西。 为什么deleteB_x(int)不起作用,为什么如果我们删除CascadeType,它就会开始起作用? 我觉得这样的deleteB_X(int)是非常清洁的解决方案,以从DB不是删除对象B deleteB_Y(int)但遗憾的是它不会工作,因为它用的CascadeType colides。

编辑1。 方法deleteB_X(int)只是不会从数据库中删除对象,如果我们删除cascade = CascadeType.ALL一切都可以。 为什么?

问题是我的class Aclass B实例中被获取了EAGER ,因此(我假设)当我单独删除B的实例而不照顾private Set<B> objectSet中的相同B实例时,存在冲突。 private Set<B> objectSet EAGER更改为LAZY或从@OneToMany(cascade=...)排除CascadeType.PERSIST解决了我的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM