class User { List<Group> groupList } //groupList立即加载
class Group { List<User>} userList } //userList延迟加载
重写了equals方法,先用eclipse自动生成,然后因为hibernate返回的list是代理对象(PersistentBag),所以改了equals方法一点
User类的equals方法片段:
if(this.groupList == null && !other.groupList.isEmpty()) return false;
Group类的equals方法片段:
if(this.userList == null && !other.userList.isEmpty()) return false;
hibernate返回一个user列表,跟我自己创建的userList进行比较
Assert.assertEquals(expectedUserList, actualUserList);
问题来了,第一层的User的equals方法比较式没问题的,但比较到user里面的group时,group的userList还没有加载,这时候调用List.isEmpty()其实是调用了PersistentBag的isEmpty()这个方法回去进一步查数据库,这个时候session已经关闭了。
expectedUserList是
User user = new User();
user.setGroupList(new Group[]{new Group()};
List expectedUserList = new ArrayList();
expectedUserList.add(user);
我试过的方法:
尝试使用aop,但第一actualUserList是运行时new出来的,所以只能对PersistentBag进行类加载时的aop操作,为了测试而改变类定义,这样改动太大,而且我所知道的,要对目标类写annotation,但PersistentBag是封装在hibernate包里面的,不想改动它
问题补充:补充:
解决方法二:OpenSessionInView,我也不想用这个方法, 因为我需要在dao层拿到所有的数据,这样我的测试代码就应该像service层访问代码一样,osiv破坏了分层,变成下层依赖上层了
相关推荐
hibernate延迟加载解决 延迟加载的具体解决方法
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
深入理解hibernate懒加载技术,正确使用懒加载
Hibernate集合属性的延迟加载.doc
Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。
Hibernate延迟加载以及利用Spring 大家看看 参考一下
这个是完整的Hibernate双向一对多的项目,我已经运行成功,有利于我们下载更好的学习
Hibernate的延迟加载
hibernate双向多对多关联映射(注解版)
hibernate多对多映射关系,操作实体类,第三篇,使用于新手
hibernate双向一对多关联映射(注解版)
多对多双向关联 <br>注意映射规则: <set name="roles" table="t_user_role"><br> <key column="userid"/><br> <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/> </set><br> table...
Hibernate延迟加载Hibernate延迟加载
Hibernate 系列教程 双向多对多
hibernate双向一对多关联映射(XML)
Hibernate延迟加载机制.zip
Hibernate双向一对一关联映射(注解版)
入门时自己根据资料写的一个实例,仅供新手参考,资深者莫下!