论坛首页 Java企业应用论坛

hibernate多对多中出现set不断循环的情况

浏览 3953 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-12-23   最后修改:2013-12-23

单位dept表和分组group表,一个组可以有多个单位,一个单位可以在多个组。

 

数据量大的时候,set<>中的数据出现了错误



 

 

后来Debug发现,在读取数据的时候出现:读取dept的时自动去找groups,而set中的每一个group对象又去找set<dept>,就这样一直循环下去



 

 

 

 

下面是我仿照hibernate开发文档写的配置

 

    class Dept{  
      ....  
      Set<Group> groups;  
      get/set....  
    }  
       
    class Group{  
     ....  
     set<Dept> depts;  
     get/set....  
    }  

 Dept配置

 

 

<set name="groups" table="DEPT_TO_GROUP" inverse="true"   lazy="true">
            <key column="DEPTID"/> 
            <many-to-many class="com.bean.Group" column="GROUPID" />
</set> 

 

 

Group配置

 

<set name="depts"  table="DEPT_TO_GROUP"  lazy="true"  >
            <key column="GROUPID"/>
            <many-to-many class="com.bean.Dept" column="DEPTID" />
</set> 

 

 

List的读取方式是:

getHibernateTemplate().find("  from Dept t ")

 

 

但上面的问题还是会出现,请问有人知道为什么会出现这种情况吗?

  • 大小: 9.4 KB
  • 大小: 18.7 KB
   发表时间:2013-12-24  
没看见第一行和第五行的id都是17吗,都是同一个对象。
0 请登录后投票
   发表时间:2013-12-24   最后修改:2013-12-24

[quote="dohkoos"]没看见第一行和第五行的id都是17吗,都是同一个对象。[/quote]

因为原来的对象数据太多不方便显示这个问题,所以我在main里用java类将原对象放进set   模拟出上面的图

 

平时是不需要set的数据的,所以设置了懒加载,但只是使用 from Dept t where t.id = 1时也会读出set


而且即使需要这样读取set,但如果是这种一个set嵌套一个set的情况,不会对程序造成过多不必要的负担吗?而且整个list变得很庞大,像From Dept t where t.id = 1,我只需要id为1的dept对象和在中间表中的deptid=1的group数据,但他却把depts的也读了

 

而depts里面的每个dept对象又去读取groups......这样的话,我只要在中间表设置一个数据:dept 1,group 1。当我读id=1的dept的时候,dept就要去中间表找groups【from 中间表 where dept=1】,而groups里的每一个group又会去中间表找depts【from 中间表 where group=1】,然后里面的每一个dept又去找回groups【from 中间表 where dept =1】,groups里面的group又......................即使对象是已经存在的,但创建的引用再少也会占用空间,我感觉这里很有问题

0 请登录后投票
   发表时间:2013-12-24   最后修改:2013-12-24

使用递归去遍历

public void reDepartments (DepartmentGroup groups)throws Exception{
		Iterator<Department> iterator = groups.getDepartment().iterator();
		while(iterator.hasNext()){
			Department dept = iterator.next();	
			System.out.println(dept.getName());
			reDepartmentGroups(dept);
		}

}
	
public void reDepartmentGroups(Department dept)throws Exception{
		Iterator<DepartmentGroup> iterator = dept.getDepartmentGroup().iterator();
		while(iterator.hasNext()){
			DepartmentGroup group = iterator.next();
			System.out.println(group.getName());
			reDepartments(group);
		}
}
//调用代码块
try{
   Department department = (Department) getHibernateTemplate().get(Department.class.getName(),"1");
   reDepartmentGroups(department);
}catch (Exception e) {
   e.printStackTrace();
}

 出现Caused by: java.lang.StackOverflowError at错误


 

 

  • 大小: 51.1 KB
0 请登录后投票
   发表时间:2013-12-25   最后修改:2013-12-25
引用
而且即使需要这样读取set,但如果是这种一个set嵌套一个set的情况,不会对程序造成过多不必要的负担吗?


什么叫同一个对象还明白啊?

A对象和B对象互相引用,可以从A中查看到B,也可以从B中查看到A。实际上就两个对象A和B。

0 请登录后投票
   发表时间:2013-12-26   最后修改:2013-12-26

 

引用
而且即使需要这样读取set,但如果是这种一个set嵌套一个set的情况,不会对程序造成过多不必要的负担吗? 什么叫同一个对象还明白啊? A对象和B对象互相引用,可以从A中查看到B,也可以从B中查看到A。实际上就两个对象A和B。

 

 - -!你这个意思我明白了 。。。是上面的列子不妥,我新建了一个student和teacher的多对多测试,情况如下:

 

public Teacher QueryInfoById(int id) {
	return (Teacher)sessionFactory.getCurrentSession().createQuery("from Teacher t where t.id = "+id) .uniqueResult();
}
Teacher teacher = teacherDao.QueryInfoById(1);

 Debug查看的情况:张老师和那2学生是我想要的


但那2学生之下还可以无限的展开,获得其他老师和同学的信息


我想知道造成这个的原因和会不会对程序造成影响
 
 

  • 大小: 13.5 KB
  • 大小: 58.3 KB
0 请登录后投票
   发表时间:2013-12-26  
从A中查看到B,从B中可以查看到C,从C中可以查看到A
0 请登录后投票
   发表时间:2014-04-28  
且学且珍惜,得认学习真正消化
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics