在Hibernate中无法从父级中的集合中删除已分离的子级

时间:2015-02-17 19:58:50

标签: java hibernate jpa hibernate-cascade

我有以下具有父子关系的实体:

public class Parent {
  @Id @GeneratedValue String id;

  @Version Long version;

  @OneToMany(mappedBy = "parent", orphanRemoval = true)
  @Cascade({CascadeType.ALL})
  Set<Child> children;

  // getters and setters
}

public class Child {
  @Id @GeneratedValue String id;

  @ManyToOne
  @JoinColumn("parent_id")
  Parent parent;

  // getters and setters
}
  1. 我通过复制属性检索父级以便在Web UI上编辑到ParentDto,其中包含ChildDtos列表。
  2. 完成编辑后,我将ParentDto对象发回,并将所有属性复制到新的父对象(父对象)中,并使用新的HashSet存储从ChildDtos列表创建的子对象。
  3. 然后我调用getCurrentSession()。update(parent);
  4. 问题

    我可以添加孩子,更新孩子,但我不能删除孩子。这里有什么问题,如何解决?

    提前致谢。

1 个答案:

答案 0 :(得分:1)

您有一个双向关联,您需要从Child类中删除父类的链接,尝试将Parent引用为null,并将Set<Child>设置为新的{{1或者你的实现是什么。 然后保存将从表中删除子项的更改。

此操作只能在活动交易的上下文中使用。

HashSet<Child>

转移托管实例以删除。在下一次刷新或提交时,实例将从数据存储中删除。访问已删除的实体具有未定义的结果。

对于给定的实体A,remove方法的行为如下:

public void remove(Object entity);

删除操作会递归A的所有关系字段,其级联包括If A is a new entity, it is ignored. However, the remove operation cascades as defined below. If A is an existing managed entity, it becomes removed. If A is a removed entity, it is ignored. If A is a detached entity, an IllegalArgumentException is thrown. 了解有关实体lifecycle的更多信息