Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何持久化具有现有持久化对象的瞬态实体?_Java_Database_Hibernate - Fatal编程技术网

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

Java 如何持久化具有现有持久化对象的瞬态实体?,java,database,hibernate,Java,Database,Hibernate,持久化父对象的正确方法是什么,应该附加子对象?子对象可能已经存在于数据库中,并且可能独立存在 @Entity class Parent { @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) Child child; } 用法: Parent p = new Parent("parent"); Child c = new Child("test"); Child

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

@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?
Well entityManager.merge()用于将分离对象的更改保存到数据库中。合并调用不会将对象直接更新到数据库中。它将更改合并到持久性上下文中,并在事务提交时刷新

另一方面,Persist通常只应在新对象上调用

通读这篇文章,解释得很好

这里要注意的另一个要点是,merge方法有一个returntype,它将实体返回给您。因此,它有点像一个更新,尽管传入的实体被分离,现在返回的实体被附加到持久性上下文。 Persist没有返回类型,有点像创建