Jpa 从多通关系中删除对象不会更新父集合
我父母和孩子之间有很多种关系。我想删除回答某个查询的多个子实体。 问题是,在运行删除查询后,Parent.getChildren仍然返回已删除的子级 在这种情况下,我不能使用删除查询吗Jpa 从多通关系中删除对象不会更新父集合,jpa,jpa-2.0,Jpa,Jpa 2.0,我父母和孩子之间有很多种关系。我想删除回答某个查询的多个子实体。 问题是,在运行删除查询后,Parent.getChildren仍然返回已删除的子级 在这种情况下,我不能使用删除查询吗 @Entity @Table(name = "CHILD_DATA") public class Child { private Parent parent; } @Entity @Table(name = "PARENT") public class Parent{ private Set
@Entity
@Table(name = "CHILD_DATA")
public class Child {
private Parent parent;
}
@Entity
@Table(name = "PARENT")
public class Parent{
private Set<Child> children;
@Column(name = "CHILDREN")
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public Set<Child> getChildren() {
return children;
}
}
public class ChildDAO{
public int removeServiceFrontPageData(Parent parent, long serviceID){
String query = "DELETE FROM Child WHERE parent =:parent";
Query q = em.createQuery(query);
q.setParameter("parent", parent);
return q.executeUpdate();
}
}
谢谢我的解决方案基于另一个 我找到了两种解决方法: 1如果删除子项,则更新父项: 选择应删除的子实体。 从parent.getChildren中删除这些实体 从数据库中删除子项 2在parent.getChildren上添加=true标志。从集合中删除子项将从数据库中删除它们
@Entity
@Table(name = "PARENT")
public class Parent{
private Set<Child> children;
@Column(name = "CHILDREN")
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
public Set<Child> getChildren() {
return children;
}
尝试将parent.id更改为parent,并传递对象本身,而不是id。您所拥有的应该可以工作。我已更改为parent,没有影响。请注意,q.executeUpdate返回许多已删除的实体,但parent.getChildren不会更新。它可能会从缓存中带来数据。@lili您是否在自己的会话/事务中执行删除操作?同时尝试刷新会话。我尝试添加em.flush。我添加了一个单元测试:首先创建带有子对象的父对象,然后删除子对象,然后带上父实体并检查其子对象。检查失败,因为父项包含已删除的子项。确定,隔离问题。取出where子句的serviceId部分,看看它是否可以通过父级删除。验证是否在子系统上正确设置了服务。我注意到它不在子类的代码中
@Entity
@Table(name = "PARENT")
public class Parent{
private Set<Child> children;
@Column(name = "CHILDREN")
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
public Set<Child> getChildren() {
return children;
}