默认的立即检索策略的缺点;
1.select语句的数目太多,需要频繁的访问数据库。会影响检索性能。如果需要查询n个对象。那么必须执行n+1次select查询语句。这种检索策略没有利用sql的连接查询功能。例如:select * from customers left outer join orders on customers.id=orders.customer_id
2.以上select语句使用sql的左外连接查询功能,能够在一条select语句中查询出customers表中的所有记录,以及匹配orders表的记录。
3.在应用逻辑只需要访问customer对象。而不需要访问order对象的场合,加载order对象完全是多余的操作。这些多余的order对象白白浪费了许多内存空间。
在一对多关联级别,使用延迟检索策略。
对于<set>元素,应该优先使用延迟检索策略。如果只是查一的一方。适用立即检索策略,会把多的一方也给查出来。
<set name="orders" invers="true" lazy="true">设置lazy为true即设置延迟检索策略。
此时运行Customer customer=(Customer)session.get(Customer.class,new Long(1))仅立即检索Customer对象,执行以下select语句。
select * from customer where id=1
在一对多关联级别,使用延迟检索策略。
customer对象的order变量引用集合代理类实例,当应用程序第一次访问它,例如调用customer.getOrders().iterator()方法时,hibernate会初始化这个集合代理类实例。在初始化过程中到数据库检索所有customer关联的order对象。执行以下select语句:select * from order where customer_id=1;
延迟检索策略:
优点:由应用程序决定需要加载哪些对象。可以避免执行多余的select语句。以及避免加载应用程序不需要访问的对象。因此能提高检索性能。并且能节省内存空间。
缺点:应用程序如果希望访问游离状态的代理类实例。必须保证它在持久化状态时已经被初始化了
适用范围:
1.一对多或者多对多关联。
2.应用程序不需要立即访问或者根本不会访问的对象。
在多对一关联级别,使用左外联机检索策略:
默认情况下,多对一关联使用左外连接检索策略。
如果把order.hbm.xml文件的<many-oto-one>元素的outer-join的属性设为true,总是使用左外连接检索策略。如:
Order order=(Order)session.get(Order.class,new Long(1));
在运行session.get()方法时,hibernate执行以下select语句。select * from orders left outer join Customers on orders.customer_id=customers.id where order.id=1
左外连接检索策略:
优点:1.对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象。
2.使用了外连接。select语句数目少了。
缺点:可能会加载应用程序中不需要访问的对象。浪费内存空间。复杂的数据库表连接也会影响检索性能。
适用范围:
多对一或者一对一关联
应用程序中需要立即访问的对象。
数据库系统具有良好的表连接性能。
在程序中显示指定左外连接检索策略。
1.在映射文件中设定的检索策略是固定的。要么为延迟检索。要么为立即检索,要么为外连接检索
在应用逻辑是多种多样的。有些情况下需要延迟检索。而有些情况下需要外连接检索。
2.hibernate允许在应用程序中覆盖映射文件中设定的检索策略。由应用程序在运行时决定检索对象图的深度。
以下session的方法都用于检索oid为1的customer对象。
session.createQuery("from Customer as c where c.id=1");
session.createQuery("from Customer as c left join fetch c.orders where c.id=1");
在执行第一个方法时,将使用映射文件配置检索策略
在执行第二个方法时,在HQL语句中显式指定左外连接检索关联的order对象。因此会覆盖映射文件配置的检索策略。不管在Customer.hbm.xml文件中<set>元素的lazy属性是true还是false,hibernate都会执行以下select语句。
select * from Customers left outer join Orders on Customer.id=Orders.customer_idwhere Customers.id=1
分享到:
相关推荐
### 马士兵Hibernate学习笔记知识点总结 #### 一、HelloWorld示例 - **目的**:通过简单的示例理解Hibernate的基本使用流程。 - **步骤**: - 创建Java项目`hibernate_0100_HelloWorld`。 - 建立库依赖,包括...
### 对象持久化与Hibernate学习笔记 #### 一、对象持久化的概念与重要性 - **定义**: 对象持久化是指将程序中的对象状态存储到持久化存储设备上的过程,以便在程序结束运行后仍然可以保留这些数据。 - **必要性**:...
根据提供的信息,我们可以总结出以下关于达内HIBERNATE学习笔记的重要知识点: ### 第一章:Hibernate入门 #### 1.1 学习目标 - 理解Hibernate的基本概念。 - 掌握如何使用Hibernate进行开发。 #### 1.2 对象持久...
【hibernate个人学习笔记完整版】是一份详尽的资料,涵盖了Hibernate框架的基础到高级应用,旨在帮助学习者深入理解和掌握这一强大的Java对象关系映射(ORM)工具。Hibernate作为Java开发中的主流ORM框架,它极大地...
在“Hibernate学习笔记第二部分”中,我们将深入探讨这个强大的工具,特别是针对初学者的基础概念和实践操作。 1. **对象关系映射(ORM)**: ORM是Hibernate的核心特性,它允许开发者使用面向对象的编程方式来处理...
本文档基于魔乐科技李兴华老师的 Hibernate 教程笔记进行整理与扩展,主要介绍了 Hibernate 的数据检索方法,特别是 HQL(Hibernate Query Language)的使用技巧。 #### 二、HQL 基础 HQL 是一种面向对象的查询语言...
### Hibernate学习笔记精要 #### 一、HelloWorld与Hibernate入门 **HelloWorld**是学习任何新技术时的经典第一个程序,Hibernate也不例外。通过构建一个简单的Java项目`hibernate_0100_HelloWorld`,我们可以熟悉...
【Hibernate学习笔记】 Hibernate是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中管理和持久化数据库对象的便捷方式。这个学习笔记将深入探讨Hibernate的核心概念、功能以及如何在实际...
在本笔记中,我们将学习如何使用 Hibernate 的 Criteria API 进行数据检索,包括检索指定姓名的用户、检索年龄大于 25 岁的用户和检索年龄小于 25 岁的用户等。 检索指定姓名的用户 在检索指定姓名的用户时,我们...
### Hibernate—我的Hibernate学习笔记 #### 一、对象持久化的理论与实践 ##### 对象持久化概念 对象持久化指的是将内存中的对象状态保存至外部持久性存储设备(如硬盘),以便于日后需要时能够恢复其状态。这一...
【hibernate学习笔记】 Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种方便地操作数据库的方式,使得开发者无需直接编写SQL语句,就能实现对象与数据库之间的数据交互。本笔记将带你...
### Hibernate 学习笔记知识点详解 #### 一、对象持久化的理论 - **定义**: 对象持久化是指将内存中的对象状态保存到外部存储设备(如磁盘)上的过程,以便在需要时能够重新加载并恢复对象的状态。 - **原因**: -...
- **灵活性**:Hibernate 支持多种数据库,并且提供高度灵活的映射策略。 - **主流框架**:在企业级应用开发中,Hibernate 被广泛采用,拥有丰富的社区支持和资源。 ### Hibernate 学习目标 1. **掌握 Hibernate ...