[Hibernate]将瞬态对象与子对象合并

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

}

当我创建一个新的(瞬态)Parent对象并添加新的childrens,然后尝试更新(evict & merge),然后日志在刷新Hibernate会话后显示如下:

INSERT PARENT //everythings here is ok.

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

订单很好,但在插入时,子级没有父级ID。当父级在数据库中持久化时,一切正常,然后子级总是有一个良好的ID。

有什么想法可以从瞬态对象获取ID(从已持久化的对象中获取ID可以)。

问候 KZ。


你尝试过通过session.saveOrUpdate()先保存瞬态实例,以便将id附加到实体上吗?在子对象的插入操作执行时,你是否在调试器中检查了实体是否具有id? - fasseg
1个回答

2

根据定义,短暂对象没有ID,因此您无法从短暂对象获取ID。

如果创建了新对象,为什么要执行合并操作?应该将新对象保存。如果更改现有对象的值,则应更新它。只有在持久对象变为分离状态,并且需要重新连接时才应该执行合并操作。


考虑一个非常复杂的对象图。假设我将其导出到XML中,进行一系列更改,然后再次导入。如果你必须获取现有的持久对象,然后将其与旧对象及其级联和依赖项进行比较和更新,则可能会非常困难且难以维护。相反,创建一个新的瞬态对象,将其与旧对象进行比较,为新的瞬态对象添加ID,合并并保存,这将是很好的选择。这就是我想要做的事情,但是您是否在说这不可能呢? - eipark
如何区分具有非空ID的新对象和已分离对象?我想没有办法。因此,使用设置ID的新对象进行合并是可以的。如果我们的实体是不可变的,那么我们可能会有这种逻辑-我们必须创建新对象。 - ses

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接