0 0

Hibernate使用双向多对多,延迟加载返回List(PersistentBag)怎样进行单元测试5

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破坏了分层,变成下层依赖上层了
2014年12月30日 09:36

2个答案 按时间排序 按投票排序

0 0

你可以使用join fetch预先抓取。

可以看这个例子

http://git.oschina.net/sphsyv/sypro

2014年12月31日 12:54
0 0

User查出来后,调用一次user.group.userList.count,强制这个时点进行load数据。
然后再比较测试。

2014年12月30日 09:52

相关推荐

Global site tag (gtag.js) - Google Analytics