1

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

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. 我通过将属性复制到具有 ChildDtos 列表的 ParentDto 来检索 Parent 以在 Web UI 上进行编辑。
  2. 完成编辑后,我将 ParentDto 对象发回并将所有属性复制到具有新 HashSet 的新父对象(父对象)中,以存储从 ChildDtos 列表创建的子对象。
  3. 然后我调用 getCurrentSession().update(parent);

问题

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

提前致谢。

4

1 回答 1

1

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

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

public void remove(Object entity);

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

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

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.

删除操作在 A 的所有关系字段上递归,其级联包括CascadeType.REMOVE. 阅读有关实体生命周期的更多信息

于 2015-02-17T20:07:12.393 回答