【问题标题】:Delete object from ManyToOne relationship doesn't update a parent collection从 ManyToOne 关系中删除对象不会更新父集合
【发布时间】:2015-08-07 19:54:27
【问题描述】:

我在 Parent 和 Child 之间有 ManyToOne 关系。我想删除回答某个查询的多个子实体。 问题是,在我运行 Delete 查询后,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();
        }
}

要刷新父实体,我使用以下函数:

public class ParentDAO{

    public Parent getParent(String parentID){
        final String select = "FROM Parent WHERE parentID = :parentID";
        Query q = em.createQuery(select);
        q.setParameter("parentID", parentID);
        if(q.getResultList().isEmpty()){
            return null;
        }
        return (Parent) q.getSingleResult();
    }

}

谢谢

【问题讨论】:

  • 尝试将 parent.id 更改为只是 parent,并传递对象本身,而不是 id。你所拥有的应该是有效的。
  • 我改成父母了,没有影响。请注意, q.executeUpdate() 返回许多已删除的实体,但 parent.getChildren() 未更新。它可能会从缓存中获取数据。
  • @lili 您是否在自己的会话/事务中进行删除?也尝试刷新会话。
  • 我尝试添加 em.flush()。我添加了一个单元测试:首先我创建带有孩子的父母,然后我删除孩子,然后我带来父实体并检查它的孩子。检查失败,因为父项包含已删除的子项。
  • 好的,隔离问题。取出 where 子句的 serviceId 部分,看看它是否只是试图被父母删除。验证在孩子上正确设置了服务。我注意到它不在 Child 类的代码中

标签: jpa jpa-2.0


【解决方案1】:

我的解决方案是基于另一个post

我找到了两种解决方法:

1) 如果我删除子级,则更新父级:

  • 选择应删除的子实体。
  • 从 parent.getChildren() 中删除这些实体
  • 从数据库中删除孩子

2) 在 parent.getChildren() 上添加 orphanRemoval=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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多