Jpa 从多通关系中删除对象不会更新父集合

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

我父母和孩子之间有很多种关系。我想删除回答某个查询的多个子实体。 问题是,在运行删除查询后,Parent.getChildren仍然返回已删除的子级

在这种情况下,我不能使用删除查询吗

@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;
    }