代码如下
java 代码
- ......
- Family family = (Family) this.getRequest().getSession().getAttribute("family");
- familyId = family.getFamilyid();
- Set systemdata = family.getSystemdatas();
- ......
报异常:org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
上网查了之后,原因是hibernate的延迟检索lazyInitialization=true的时候
当执行Session的load()方法时,Hibernate不会立即执行查询Family表的select语句,仅仅返回Family类的代理类的实例,这个代理类具由以下特征:
(1) 由Hibernate在运行时动态生成,它扩展了Family类,因此它继承了Family类的所有属性和方法,但它的实现对于应用程序是透明的。
(2) 当Hibernate创建Family代理类实例时,仅仅初始化了它的familyId属性,其他属性都为null,因此这个代理类实例占用的内存很少。
(3)当应用程序第一次访问Family代理类实例时(例如调用family.getXXX()或family.setXXX()方法), Hibernate会初始化代理类实例,在初始化过程中执行select语句,真正从数据库中加载Family对象的所有数据。但有个例外,那就是当应用程序访问Family代理类实例的getFamilyId()方法时,Hibernate不会初始化代理类实例,因为在创建代理类实例时familyId就存在了,不必到数据库中去查询。Hibernate采用CGLIB工具来生成持久化类的代理类。CGLIB是一个功能强大的Java字节码生成工具,它能够在程序运行时动态生成扩展 Java类或者实现Java接口的代理类。
如果在整个Session范围内,应用程序没有访问过Family对象,那么Family代理类的实例一直不会被初始化,Hibernate不会执行任何select语句。
上面那段代码由于引用变量family引用的Family代理类的实例在Session范围内始终没有被初始化,因此在执行family.getSystemdatas()方法时,Hibernate会抛出异常:
由此可见,Family代理类的实例只有在当前Session范围内才能被初始化。
java 代码
- ......
- Session ssesion = persistence.getHibernateSession();
- Transaction ts = ssesion.beginTransaction();
- ssesion.load(Family.class,familyId);
- Hibernate.initialize(family);
- Set systemdata = family.getSystemdatas();
- ......
ok,问题解决了
分享到:
相关推荐
Hibernate延迟检索的原理 ##### 实体对象的延迟加载 实体对象的延迟加载是指当真正需要某个实体对象的数据时,才执行数据加载操作。在Hibernate中,可以通过在实体的映射配置文件中设置`lazy="true"`来启用实体...
标题和描述提到的“hibernate延迟加载解决”主要涉及如何理解和解决与之相关的常见问题。 **1. 延迟加载概念** 延迟加载是一种优化策略,它使得关联的对象在真正需要时才从数据库中加载,而不是在加载主对象时立即...
这是HIBERNATE默认的抓取策略,当一个实体被加载时,与之关联的实体或集合并不会立即加载,而是采用延迟加载(Lazy Loading)的方式。当第一次访问关联实体或集合时,HIBERNATE会额外发送一条SELECT语句来抓取数据,...
在Java的持久化框架Hibernate中,延迟加载(Lazy Loading)是一种优化策略,旨在提高应用程序的性能和效率。当一个实体的某个属性是一个关联的集合,如一对多的关系,Hibernate默认会采用延迟加载机制。这意味着在...
- 需要额外处理延迟加载时可能出现的N+1查询问题。 - 懒加载可能导致难以追踪的问题,尤其是在事务管理不当的情况下。 #### 三、关联级别检索策略 关联级别检索策略是指当加载实体之间的一对多或多对多关联时,...
Hibernate提供三种主要的检索策略:立即检索、延迟检索和迫切左外连接检索。 1. **立即检索**:这种策略将立即加载关联的对象,无论对象是持久化状态还是游离状态。优点是应用程序可以方便地导航到关联的对象,无需...
今天我们将深入探讨“Hibernate检索和优化”,特别是“简单查询及别名查询”这两个核心概念,它们在实际开发中具有广泛的应用。 在Hibernate中,数据检索主要通过Criteria、HQL(Hibernate Query Language)和原生...
本人在厦门邦初培训时候 使用的快速入门精简文档 Session缓存的作用 Session清理缓存的时间点 对象的临时状态、持久状态和游离状态 ...延迟装载 迫切左外链接 HQL检索方式 QBC检索方式 本地SQL检索方式
如果在关联级别设置了延迟加载策略,则首次执行此方法时,Hibernate会自动从数据库中加载这些关联的`Order`对象,否则将从缓存中获取。 ##### 2. OID检索方式 OID(Object Identifier)检索方式是指通过对象的唯一...
- **延迟检索**:通过在`<class>`标签中设置`lazy="true"`来启用。该策略下,只有在真正需要访问关联对象时才进行查询。 - **关联级别检索策略**: - **立即检索**:`lazy="false"`且`outer-join="false"`。默认...
- **延迟检索(Lazy Fetching)**:应用程序可以根据需要决定何时加载对象,减少无用的数据库交互,节省内存。缺点是游离状态下的代理类需要在持久化状态下初始化。 - **迫切左外连接检索(Fetch Join)**:兼顾...
- **延迟检索**:只有当需要访问关联对象时才加载。 通过以上内容,我们了解了Hibernate的基本概念、配置步骤、核心类以及查询语言和检索策略等内容,这对于高效地使用Hibernate框架是非常有帮助的。
《J2EE Hibernate-6.ppt》探讨了Hibernate在J2EE环境中的检索策略,主要涉及立即检索策略、延迟检索策略以及迫切左外连接检索策略。 1. **立即检索策略**: 立即检索策略是Hibernate默认的检索方式。在处理一对多...
- "2018-7-27-Hibernate-检索方式.pptx"可能涵盖了Hibernate的多种检索方式,如Query、Criteria、HQL等,以及它们的使用场景和优缺点。 - "04-2018-7-8-Hibernate-functiongtest.pptx"可能是关于函数测试和Hibernate...
3. **迫切左外连接检索**:结合了立即检索和延迟检索的优点,提供了一种更加灵活的检索方式。适用于一对一或多对一关联。 ### ORM解决的不匹配问题 - **域模型与关系模型之间的不匹配**: - 面向对象的域模型与...
16.3.4 批量延迟检索和批量立即检索(使用batch-size属性) 16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”) 16.3.6 迫切左外连接检索(fetch属性为“join”) 16.4 多对...
为了解决这个问题,Hibernate提供了两种主要的检索策略:延迟检索和迫切左外连接检索。 1. **延迟检索策略**:这种策略允许我们在需要时才加载关联对象。默认情况下,Hibernate对集合关联使用的就是延迟加载。在...
在Hibernate中,针对关联对象的检索,有三种主要的检索策略:立即检索(Eager Fetching)、延迟检索(Lazy Fetching)和迫切左外连接检索(Anxious Left Join Fetching)。下面将详细探讨这三种策略的特点。 #### 1. 立即...
-延迟加载(Lazy Loading):只在需要时加载关联对象,避免数据冗余。 8. **HQL和Criteria API**: HQL是面向对象的查询语言,类似于SQL但更接近Java。Criteria API则提供了一个程序化的查询方式,可以在运行时...
【Hibernate面试问题详解】 1. 什么是ORM? ORM(Object-Relational Mapping)是一种技术,它将Java应用程序中的对象自动持久化到关系数据库的表中。通过ORM,开发者可以使用面向对象的方式处理数据库操作,无需...