[英]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);
}
我的理解(如果我错了,请纠正我):
orphanRemoval=true
所以deleteB_Y(int)
将起作用。 mappedBy
参数,我们可以说类A是关系的“拥有站点”。 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 A
在class 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.