2010-11-25 50 views
3

我在合并时遇到了一些问题。我的更新方法的工作是这样的:[休眠]将子对象与瞬态对象合并

void update(Parent parent) { 
    evict(parent); 
    merge(parent); 
} 

我的课:

Parent { 

    Long id; 

    List<Children> childrens; 

    @OneToMany(targetEntity =ChildrenImpl.class, fetch=FetchType.LAZY) 
    @JoinColumn(name="PARENT") 
    @org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
    List<Children> getChildrens(){...} 

    @Id 
    Long getId() {...} 

} 



Children{ 

    Parent parent; 

    @ManyToOne(targetEntity = ParentImpl.class, fetch = FetchType.LAZY) 
    @org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
    @JoinColumn(name = "PARENT", nullable = false) 
    Parent getParent(){...} 

} 

当我创建一个新的父(瞬态)的对象,并添加新的儿童,并试图更新(驱逐&合并),那么日志显示我这冲刷休眠会议后:

INSERT PARENT //everythings here is ok. 

INSERT CHILDREN // but without parent id(id=null) 

订单是好的,但儿童没有在插入父ID。当父母坚持数据库时,一切正常,然后孩子总是有一个好的ID。

任何想法我应该怎么做才能从瞬态对象(从持久确定)获得id。

Regards KZ。

+0

您是否尝试先通过session.saveOrUpdate()保存瞬态实例,以便将某个ID附加到实体?你是否在执行子对象插入操作时检入一个调试器,表明你的实体有一个ID? – fasseg 2010-11-25 23:13:38

回答

2

您无法从瞬态对象获取id,按照定义,瞬态对象没有id。

为什么你要做一个合并,如果你创建一个新的对象?当你创建一个新的对象时,你应该保存它。如果您更改现有对象的值,则应更新它。只有当持久对象变为分离时,您才应该合并,并且您需要重新附加它。

+0

然后以一个非常复杂的对象图为例。假设我将它导出为XML,进行一系列更改,然后再导入它。如果必须获取现有的持久对象,然后将其与旧对象及其所有级联进行比较,则可能会非常困难且难以维护,依赖关系并更新它。相反,创建一个临时对象与新对象,新旧对比,将新ID添加到新瞬态对象,合并和保存会很好。这是我想要做的,但你说这是不可能的? – eipark 2013-03-15 15:38:46