[Hibernate]合并儿童的瞬态对象

时间:2010-11-25 22:19:59

标签: java hibernate mapping

我对合并有些疑问。我的更新方法以这种方式工作:

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(){...}

}

当我创建一个新的Parent(瞬态)对象并添加新的子项并尝试更新(evict&amp; merge)时,日志会在刷新hibernate会话后显示:

INSERT PARENT //everythings here is ok.

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

订单很好但是孩子在插入时没有父ID。当Parent保存在数据库中时,一切正常,然后孩子们总是有一个好的id。

我应该怎么做才能从瞬态对象中获取id(来自持久化)是正确的。

此致 KZ。

1 个答案:

答案 0 :(得分:2)

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

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