如何在休眠状态下更新集合?

问题描述

| 我有以下课程:
class A {
  Integer id;

  @OnetoMany(mappedBy=\"parent\",fetch=FetchType.EAGER,cascade={CascadeType.ALL})
  Set<B>  children;
}

class B {
  Integer id;

  @ManyToOne(fetch=FetchType.EAGER)
  A parent;
}
数据库中有数据,比如说a1以{b1,b2,b3}作为子级。 当我尝试将a1的子集更新为{b4,b5}时,我最终在数据库中出现了b1..b5。 在我的代码中,我谨防在子集上调用
clear()
,但这不会影响数据库。 我应该迭代并在A \的每个孩子上叫
session.delete(child)
吗? 谢谢,     

解决方法

        从Java EE 6(和Hibernate 3.5)开始,您应该使用@OneToMany(...,orphanRemoval = true) 在Java EE 6 / Hibernate 3.5之前,可以使用
org.hibernate.annotations.CascadeType.DELETE_ORPHAN
,在3.5中已弃用了in3ѭ,以便在JPA中添加orphanRemoval。     ,        问题是Cascade.All在所有子项上。基本问题是,即使您清除父对象上的集合,子对象也将自身保存为具有a1作为父对象。这意味着您需要清除关系的两面。有两条路线: 删除子项上的cascade.all,并让父对象管理整个关系。 清除子元素上的父元素,或完全从会话中删除它们,自己手动处理这些关系。选择此路线时,您需要非常明确地了解集合中每个元素所发生的情况。