如何持久化具有现有持久对象的瞬态实体?

时间:2014-01-09 14:43:51

标签: java database hibernate

持久化父对象应该附加子对象的正确方法是什么?子对象可能已存在于DB中,并且可能独立存在。

@Entity
class Parent {
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    Child child;
}

用法:

Parent p = new Parent("parent");
Child c = new Child("test");
Child child = em.find(c);
if (child == null) {
    child = c;
}
p.setChild(child);
em.persist(p); //works only if child does not come from db, eg is transient
//em.merge(p); //works always, but is this intended to save a transient parent with persisted child this way?

1 个答案:

答案 0 :(得分:1)

井entityManager.merge()用于将分离对象的更改保存到DB中。合并调用不会将对象直接更新到DB中。它将更改合并到持久性上下文中,并在事务提交时刷新。

另一方面,坚持通常只应在New对象上调用。

仔细阅读documentation

此处需要注意的另一个要点是,merge方法具有返回类型,它将实体返回给您。所以它有点像更新,虽然传入的实体是分离的,现在返回的实体被附加到持久化上下文。 持久性没有返回类型,有点像创建