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

相关推荐

    hibernate延迟加载解决

    对于一对多关系或者多对多关系中的集合,延迟加载同样重要。这是因为,如果不使用延迟加载,加载一个实体可能会导致所有相关联的实体都被加载到内存中,从而严重影响性能。 **配置方式:** 要启用集合类型的延迟...

    hibernate 延迟加载深入剖析

    本文将对Hibernate中的延迟加载技术进行深入剖析,帮助读者更好地理解和运用这项技术。 #### 二、基本概念 ##### 2.1 什么是延迟加载? 延迟加载是指在访问关联数据或集合数据时,只有在真正需要使用这些数据时才...

    Hibernate 延迟加载剖析与代理模式应用

    在`&lt;set&gt;`元素中,我们通常会设置`lazy="true"`,这告诉Hibernate对这个集合属性使用延迟加载策略。例如,在`Person.hbm.xml`中,`&lt;set&gt;`元素的`lazy`属性设为`true`,表示`addresses`集合将被延迟加载。 在实际...

    Hibernate延迟加载以及利用Spring

    在Hibernate中,延迟加载主要用于关联对象的加载,例如一对多或多对多的关系。默认情况下,当Hibernate查询一个实体时,会同时加载与该实体相关的所有关联对象。但在某些场景下,我们可能并不需要立即获取这些关联...

    Hibernate集合属性的延迟加载.doc

    当我们处理与实体相关的集合属性时,如一对多、多对一或多对多关系,延迟加载尤其有用。 在给定的文档中,我们看到一个例子,展示了如何在 Hibernate 中配置一个具有集合属性的实体类 `Person`,以及如何通过映射...

    什么是hibernate延迟加载

    详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助

    Hibernate双向一对多

    通过这个项目,学习者可以深入理解Hibernate双向一对多关系的配置、使用及其实现细节,从而提升数据库操作和对象持久化的技能。实践中遇到的问题和解决方法也会帮助巩固理论知识,提升实际开发能力。

    Hibernate双向一对多经典实例

    **标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...

    hibernate多对多双向关联

    **标题解析:**“hibernate多对多双向关联” 在Java编程中,Hibernate是一个流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。"多对多双向关联"是Hibernate中一种关系映射类型,涉及两...

    Hibernate的延迟加载

    通过上述解析,可以看出Hibernate的延迟加载机制在多个层面提供了一种智能的性能优化策略。无论是对于单个实体还是集合,延迟加载都能确保只有在真正需要时才执行昂贵的数据库操作,极大地提升了数据加载效率和应用...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    浅析Java的Hibernate框架中的缓存和延迟加载机制

    主要介绍了Java的Hibernate框架中的缓存和延迟加载机制,Hibernate是注明的Java下SSH三大web开发框架之一,需要的朋友可以参考下

    Hibernate ORM - 多对多双向连接表关联关系

    本文将深入探讨Hibernate ORM中的一个关键概念——多对多双向连接表关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生等例子,都需要用到多对多的关系来描述它们之间的复杂联系。 首先...

    hibernate 延迟加载.docx

    3. 多对一关联:`lazy="proxy"`(延迟加载)、`lazy="no-proxy"`(无代理延迟加载)或`lazy="false"`(立即加载),默认为`proxy`。 **`load()`与`get()`的区别** 1. **加载方式**:`load()`采用延迟加载,`get()`...

    Hibernate ORM - 一对多双向关联关系

    这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...

    hibernate框架多对多测试案例

    本教程将深入讲解Hibernate框架中的多对多(Many-to-Many)映射关系,这对于理解和应用Hibernate到实际项目中至关重要。 首先,我们需要理解多对多映射的基本概念。在数据库中,多对多关系是指两个表之间存在一对多...

    Hibernate延迟加载

    3. 集合延迟加载:对于一对多(、&lt;list&gt;)和多对一关系,可以设置`lazy="true"`、`lazy="false"`或`lazy="extra"`。`lazy="true"`会在集合被访问时加载,`lazy="false"`会在加载实体时同时加载集合,而`lazy="extra...

Global site tag (gtag.js) - Google Analytics