持久化父对象应该附加子对象的正确方法是什么?子对象可能已存在于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?
答案 0 :(得分:1)
井entityManager.merge()用于将分离对象的更改保存到DB中。合并调用不会将对象直接更新到DB中。它将更改合并到持久性上下文中,并在事务提交时刷新。
另一方面,坚持通常只应在New对象上调用。
仔细阅读documentation
此处需要注意的另一个要点是,merge方法具有返回类型,它将实体返回给您。所以它有点像更新,虽然传入的实体是分离的,现在返回的实体被附加到持久化上下文。 持久性没有返回类型,有点像创建