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中的延迟加载技术进行深入剖析,帮助读者更好地理解和运用这项技术。 #### 二、基本概念 ##### 2.1 什么是延迟加载? 延迟加载是指在访问关联数据或集合数据时,只有在真正需要使用这些数据时才...
在`<set>`元素中,我们通常会设置`lazy="true"`,这告诉Hibernate对这个集合属性使用延迟加载策略。例如,在`Person.hbm.xml`中,`<set>`元素的`lazy`属性设为`true`,表示`addresses`集合将被延迟加载。 在实际...
在Hibernate中,延迟加载主要用于关联对象的加载,例如一对多或多对多的关系。默认情况下,当Hibernate查询一个实体时,会同时加载与该实体相关的所有关联对象。但在某些场景下,我们可能并不需要立即获取这些关联...
当我们处理与实体相关的集合属性时,如一对多、多对一或多对多关系,延迟加载尤其有用。 在给定的文档中,我们看到一个例子,展示了如何在 Hibernate 中配置一个具有集合属性的实体类 `Person`,以及如何通过映射...
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
通过这个项目,学习者可以深入理解Hibernate双向一对多关系的配置、使用及其实现细节,从而提升数据库操作和对象持久化的技能。实践中遇到的问题和解决方法也会帮助巩固理论知识,提升实际开发能力。
**标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...
**标题解析:**“hibernate多对多双向关联” 在Java编程中,Hibernate是一个流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。"多对多双向关联"是Hibernate中一种关系映射类型,涉及两...
通过上述解析,可以看出Hibernate的延迟加载机制在多个层面提供了一种智能的性能优化策略。无论是对于单个实体还是集合,延迟加载都能确保只有在真正需要时才执行昂贵的数据库操作,极大地提升了数据加载效率和应用...
“Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...
主要介绍了Java的Hibernate框架中的缓存和延迟加载机制,Hibernate是注明的Java下SSH三大web开发框架之一,需要的朋友可以参考下
本文将深入探讨Hibernate ORM中的一个关键概念——多对多双向连接表关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生等例子,都需要用到多对多的关系来描述它们之间的复杂联系。 首先...
3. 多对一关联:`lazy="proxy"`(延迟加载)、`lazy="no-proxy"`(无代理延迟加载)或`lazy="false"`(立即加载),默认为`proxy`。 **`load()`与`get()`的区别** 1. **加载方式**:`load()`采用延迟加载,`get()`...
这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...
本教程将深入讲解Hibernate框架中的多对多(Many-to-Many)映射关系,这对于理解和应用Hibernate到实际项目中至关重要。 首先,我们需要理解多对多映射的基本概念。在数据库中,多对多关系是指两个表之间存在一对多...
3. 集合延迟加载:对于一对多(、<list>)和多对一关系,可以设置`lazy="true"`、`lazy="false"`或`lazy="extra"`。`lazy="true"`会在集合被访问时加载,`lazy="false"`会在加载实体时同时加载集合,而`lazy="extra...