如何在hibernate上更新集合?

如何在hibernate上更新集合?,hibernate,Hibernate,我有以下课程: 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; } A类{ 整数id; @OneToMany(mappedBy=

我有以下课程:

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;
}
A类{
整数id;
@OneToMany(mappedBy=“parent”,fetch=FetchType.EAGER,cascade={CascadeType.ALL})
设置儿童;
}
B类{
整数id;
@manytone(fetch=FetchType.EAGER)
父母;
}
数据库中有数据,比如a1中有{b1,b2,b3}作为子项。 当我尝试将a1的子对象集更新为{b4,b5}时,我在数据库中得到了b1..b5。 在我的代码中,我采取了对子集合调用
clear()
的预防措施,但这不会影响数据库

我是否应该迭代并调用A的每个子级的
session.delete(child)


谢谢,

问题在于级联。所有这些都在子项上。基本问题是,即使您正在清除父对象上的集合,子对象也会将自己保存为将a1作为父对象。这意味着你需要澄清双方的关系。有两条路线:

  • 删除子项上的cascade.all,并让父对象管理整个关系

  • 通过清除子元素上的父元素,或从会话中删除它们时,手动处理这些关系。在选择此路由时,您需要非常明确地了解集合中每个元素的情况

  • 在JavaEE6(和Hibernate3.5)中,您应该使用


    在JavaEE6/Hibernate3.5之前,您可以使用
    org.Hibernate.annotations.CascadeType.DELETE_ORPHAN
    ,这在3.5中被弃用,赞成将orphanRemoving添加到JPA中

    尝试从儿童侧移除级联,效果仍然相同。以前的子成员不会被删除。知道为什么吗?在从一侧移除级联后,您是否尝试过执行clear()操作?如果这不起作用,那么最好尝试路由2-hibernate对如何让您管理多个关系非常严格。我使用的是hibernate 3.6.4,DELETE_ORPHAN显示为不推荐。感谢您指出这一点。Javadocs说它已经被弃用了,取而代之的是弃用的。使用@OneToOne(孤立删除=true)或@OneToMany(孤立删除=true)。我将更新答案,以澄清这一点。