Hibernate和子对象(添加与清除)

时间:2010-06-17 20:53:02

标签: java hibernate orm

假设我有汽车和车轮的域名模型。车轮是车轮列表 车轮与汽车有着多对一的关系。

如果我从Hibernate获得一个物体,它有4个轮子。我取出那个物体去掉4个轮子并加上4.然后保存。
如果我再次询问Hibernate对象并返回一个带8个轮子的汽车......我们做错了什么?我几天没有访问源代码,但是想让我们的Java开发人员朝着正确的方向努力。感谢。

2 个答案:

答案 0 :(得分:1)

我相信,但不是100%肯定,这取决于集合的cascade属性。例如,如果您有:

<hibernate-mapping package="com.foo">
  <class name="Automobile">
  ...
    <set name="Wheels" cascade="delete-orphan"> <!-- or "all-delete-orphan" -->
      ...
    </set>
  </class>
</hibernate-mapping>

然后那可能会这样做。

答案 1 :(得分:0)

您的问题听起来像@Embeddable类的集合,其中组件(部件 - Wheel)的生命周期与其拥有的实体实例(汽车)的生命周期绑定

@Entity
public class Automobile {

    private Integer id;

    private Set<Wheels> wheelsSet = new HashSet<Wheels>();

    @Id
    @GeneratedValue
    public Integer getId() {
        return this.id;
    }

    @CollectionsOfElements
    @JoinTable("AUTO_WHEELS")
    public Set<Wheels> getWheelSet() {
        return this.wheelsSet;
    }

}

如果你这样做

Automobile auto = session
                  .createQuery("from Automobile a left join fetch a.wheelSet where a.id = :id")
                  .setParameter("id", id)
                  .list().get(0);

/**
  * All of wheels removed
  */       
auto.getWheelSet().clear();

/**
  * New Wheels added
  */  
auto.getWheelSet().add(new Wheel());
auto.getWheelSet().add(new Wheel());
auto.getWheelSet().add(new Wheel());
auto.getWheelSet().add(new Wheel());

session.update(auto);

它将满足您的需求。但请记住您必须提供equals和hashCode实现才能正常工作

@Embeddable
public class Wheel implements Serializable {

    /**
      * equals and hashCode goes here
      * Prefer To use business key
      */

}