Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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 Hibernate-将对象集合从一个父对象传输到另一个父对象_Java_Hibernate - Fatal编程技术网

Java Hibernate-将对象集合从一个父对象传输到另一个父对象

Java Hibernate-将对象集合从一个父对象传输到另一个父对象,java,hibernate,Java,Hibernate,我有3种类型的对象-父对象、子对象和ChildAttr 我的目标是使用Hibernate(3.2.5)将孩子的子集从一个家长转移到另一个家长 对象的结构如下所示: public class Parent { Set<Child> children; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "parent") @Cascade( { org.hibernate.an

我有3种类型的对象-父对象、子对象和ChildAttr

我的目标是使用Hibernate(3.2.5)将孩子的子集从一个家长转移到另一个家长

对象的结构如下所示:

public class Parent {
  Set<Child> children;

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "parent")
  @Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
  public Set<Child> getChildren() {
    return this.children;
  }

  public void setChildren(Set<Child> children) {
    this.children = children;
  }

}
现在,假设我运行一些客户端代码,它获取父级a的子对象的子集,并将它们移动到父级B:

Set<Child> children = getChildrenToTransfer(transferCriteria, parentA);

parentA.getChildren().removeAll(children);
manager.saveOrUpdate(parentA); // method also calls flush();

parentB.getChildren().addAll(children);
manager.saveOrUpdate(parentB); // error thrown here.
该应用程序目前似乎在多个会话中都能很好地完成这项工作-例如,一些用户出现并删除了一组子项,然后不久将它们添加到其他父项中。此外,我真的不明白为什么它要实例化属性列表的多个版本,而实际上它应该只是一个版本,即使父级发生了变化


造成上述错误的原因是什么?我该如何避免它?

可以看出,这是因为您的双向关系(父子关系)。当您将子项从一个父项删除/添加到另一个父项时,您应该更新父项的引用。

看到这是因为您的双向关系(父项-子项)。将子对象从一个父对象删除/添加到另一个父对象时,应更新父对象的引用。

一条经验法则:在尝试持久化对象之前,确保对象作为对象图是一致的。。。您正在从父级A删除所有子级并将其添加到父级B,但尚未更新这些子级的父级链接

因此,我建议如下:

将方法添加到父级:

add(Child child) {
    child.setParent0(this);
    children.add(child);
}

remove(Child child) {
    child.setParent0(null);
    children.remove(child);
} 
然后是儿童:

setParent0(Parent parent) {
    this.parent = parent;
}
setParent(Parent parent) {
     parent.add(this);
}
这样,当您从任一方向添加时,您就得到了一个一致的对象模型,而外部代码不知道细节

从父对象中删除会更有意义


因此,请尝试使用这些方法。

一条经验法则:在尝试持久化对象之前,确保对象作为对象图是一致的。。。您正在从父级A删除所有子级并将其添加到父级B,但尚未更新这些子级的父级链接

因此,我建议如下:

将方法添加到父级:

add(Child child) {
    child.setParent0(this);
    children.add(child);
}

remove(Child child) {
    child.setParent0(null);
    children.remove(child);
} 
然后是儿童:

setParent0(Parent parent) {
    this.parent = parent;
}
setParent(Parent parent) {
     parent.add(this);
}
这样,当您从任一方向添加时,您就得到了一个一致的对象模型,而外部代码不知道细节

从父对象中删除会更有意义


因此,请尝试使用这些方法。

尝试删除
@Cascade
注释,在我删除Cascade注释后,您已经在
@OneToMany
中传递了Cascade,您的示例开始工作,使用Cascade,我得到了“分离的实体传递到持久化”,这不完全是您的错误,但您可以尝试…尝试删除
@Cascade
注释,您已经在
@OneToMany
中传递了级联,在我删除级联注释后,您的示例开始工作,使用级联我得到“分离实体传递到持久化”,这不完全是您的错误,但您可以尝试。。。
setParent0(Parent parent) {
    this.parent = parent;
}
setParent(Parent parent) {
     parent.add(this);
}