gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:29:07 26 4
gpt4 key购买 nike

我有 3 种类型的对象 - Parent、Child 和 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;
}

}

...

public class Child {
Set<ChildAttr> attributes;
Parent parent;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "child")
@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
public Set<ChildAttr> getAttributes() {
return this.attributes;
}

public void setAttributes(Set<ChildAttr> attributes) {
this.attributes = attributes;
}
}

...

public class ChildAttr {
Child child;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "child_id", nullable = false)
public Child getChild() {
return this.child;
}

public void setChild(Child child) {
this.child = child;
}
}

现在假设我运行一些客户端代码,该代码获取父级 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.

尝试保存parentB 时抛出错误。

Found two representations of same collection: com.mycode.Child.attributes;

该应用程序目前似乎在多个 session 中都能很好地完成这项工作 - 例如- 某个用户出现并删除了一组子项,然后一段时间后将它们添加到其他某个父项中。此外,我真的不明白为什么它要实例化该属性列表的多个版本,而实际上它应该只是一个版本,即使父级发生了变化。

是什么导致了上述错误以及如何解决它?

最佳答案

一条经验法则:在尝试持久化对象之前,请确保对象与对象图一致...如果您要从父级 A 中删除所有子级并将它们添加到父级 B 中,但尚未更新父级链接为了那些 child 。

所以我建议如下:

向父级添加方法:

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);
}

这样,当您从任一方向添加时,您都会获得一致的对象模型,而外部代码不知道详细信息。

从父级中删除更有意义......

所以尝试使用这些方法。

关于java - Hibernate - 将对象集合从一个父对象传输到另一个父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38340276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com