在学习hibernate的过程中,我遇到了Hibernate似乎有循环引用的情况,我无法理解如何应对这种情况。我有一个父母两个班级
private String uuid;
private String name;
private Set<ChildClass> childclass=new HashSet<ChildClass>();
,这是同一个
的映射文件<property name="name" type="string" column="NAME" length="255" />
<set name="childclass" table="Parent_Child" lazy="extra"
cascade="save-update">
<key column="parent_id" />
<many-to-many class="com.test.child.ChildClass" column="child_id"/>
</set>
子条目的如下
private String name;
private Set<ParentClass> parent=new HashSet<ParentClass>();
private String child_id;
<property name="name" type="string" column="NAME" length="255" />
<set name="parent" table="Parent_Child" inverse="true" lazy="extra"
cascade="save-update">
<key column="child_id"/>
<many-to-many class="com.test.parent.ParentClass" column="PARENT_ID"/>
</set>
当我在我的主要代码中尝试这样的事情时
tx1.begin();
String query="from ParentClass as pc";
Query query1=session1.createQuery(query);
List list= query1.list();
现在这里存在真正的问题,当我尝试使用迭代器方法或任何集合方法迭代列表时,它会进入无限循环,如父对子引用,并且子引用父对象
在我即将发布的作业中,我有一个父类,它有很多对子类的集合引用都具有多对一和一对多的关系。
所以似乎在那种情况下,我将尝试从父实体中获取子项,如
parent.getChild().iterator()
它将运行到循环引用。 如果我在错误的轨道上,请建议我如何避免这种情况或纠正我
答案 0 :(得分:0)
根据我的理解,你遇到这样的情况:
ID | name | parent
1 | P1 | null
2 | P2 | P4
3 | P3 | P2
4 | P4 | P2
在这种情况下,对于ID 2和4,您有一个循环引用。这是链表的“经典”问题,有几种技术(算法)可以检测到这一点。你可能想对这个主题做一些研究,因为它真的不适合stackoverflow的答案; - )
但我首先要评估业务需求是否确实要求具有可能存在循环依赖的结构。如果没有,那么您可以在“addChild()”或“setParent()”方法中进行“检查”,以验证父/子是否创建了循环依赖。简单的解决方案是始终要求顶级父记录使用“parent = null”。