2010-06-17 42 views
1

可以说我有汽车和车轮的域模型。车轮是车轮列表 车轮与汽车有着多对一的关系。休眠和子对象(添加与清除)

如果我从Hibernate获得一个对象并且它有4个轮子。我拿那个物体去除4个轮子并且加上4.然后保存。
如果我再次询问Hibernate的对象,它会返回一个带有8个轮子的汽车......我们做错了什么?我几天没有访问源代码,但希望给我们的Java开发者一个正确的方向。谢谢。

+2

是联想双向的吗? – 2010-06-17 21:07:08

+0

没有车轮只会有半径,深度等道具......没有汽车协会。仅限于从领域模型中的自动向下滚动。 – BuddyJoe 2010-06-17 21:21:09

+0

请原谅我,但您在问题中提到“车轮与汽车有多对一的关系”。你的评论实际上让事情变得更加混乱:/ – 2010-06-17 21:29:22

回答

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> 

那么这可能会这样做。

+0

非常感谢。我刚刚读到这个。 +1也许答案。我会让我的人测试这个。 – BuddyJoe 2010-06-17 21:07:24

0

你的问题听起来像@Embeddable类的集合,其中一个组件(部件 - 车轮)有其生命周期绑定到其所属的实体实例(汽车)

@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); 

它将fullfil您的需求。但请记住必须提供equals和hashCode实现做工精细

@Embeddable 
public class Wheel implements Serializable { 

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

}