`
tju_ZhangJ
  • 浏览: 38554 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Hibernate 检索策略

阅读更多
Hibernate的检索策略包括类级别检索和关联级别的检索。
类级别检索策略包括立即检索和延迟检索:
立即检索:
立即加载检索方法指定的对象。如果程序加载一个持久化对象的目的是为了访问它的属性,可以采用立即检索策略。将<class 中的lazy设置为false。在默认情况下,load()方法是采用延迟检索策略加载持久化对象的,而get()方法是采用立即检索策略的。

延迟检索策略:
类级别的默认检索策略。当需要加载一个持久化对象时,系统不会立即加载对象属性实例,而是仅初始化它的OID属性,这种策略占用的内存很少。
例如:
select * from CUSTOMERS where ID=1;
当采用load()方法时(默认检索策略为延迟检索) ,Hibernate不会执行CUSTOMERS表的Select语句,仅返回Customers类的代理类的实例,这个代理类包含了Customers类的所有属性,但仅初始化OID属性,其他属性都为null,只有当我们调用getXXX()的时候,才会初始化代理类中其他属性实例。

关联级别检索策略包括立即检索策略、延迟检索策略和迫切左外连接检索
在映射文件中用<set 元素配置一对多关联或多对多关联关系。<set 元素里面有两个属性lazy和fetch属性。下面简单介绍lazy和fetch属性:
本例采用Customer和Order两个类关联,即一个Customer对应多个Order。
lazy:主要决定orders集合被初始化的时机,即是在加载Customer对象时候就初始化就初始化,还是在程序访问orders对象的时候才初始化。当lazy为false采用前者,当lazy为true时采用后者。
fetch:取值为select或subselect时,决定初始化orders集合时的查询语句的形式,如果取值为join,决定orders集合被初始化的时机。

立即检索:lazy为false
例如:
Customer customer=(Customer)session.get(Customer.class,new Long(1));
Set orders=customer.getOrders();
Iterator orderIte=orders.iterator();

当执行get方法的时候,采用立即检索策略,Hibernate执行了一下语句:
select * from CUSTOMERS where ID=1;
select * from ORDERS where CUSTOMER_ID=1;
通过以上Select语句,Hibernate加载了一个Customer对象和与之关联的Order对象。

延迟检索策略:lazy为true
这是默认的并且应该优先考虑的检索策略。
<set name="orders" inverse="true" lazy="true"></set>
此时再运行session.get(Customer.class,new Long(1));时,仅加载Customer对象,Customer的orders属性引用一个没有初始化的集合代理类实例。
Set orders=customer.getOrders();
Iterator it=orders.iterator();//此时orders集合代理类被初始化

迫切左外连接检索:fetch为join,lazy的值将被忽略
<set name="orders" inverse="true" fetch="join"></set>
当执行一下语句时:
Customer customer=(Customer)session.get(Customer.class ,new Long(1));
Hibernate会执行以下select语句:
select * from CUSTOMERS left outer join ORDERS on CUSTOMER.ID=ORDERS.CUSTOMER_ID where CUSTOMERS.ID=1;
由select语句可知,该检索策略采用了SQL外连接的查询功能,优点在于减少了select语句的数目,同时又可以获取关联对象。缺点就是SQL语句的复杂度提高了,同时系统构建表连接也需要耗时操作。






分享到:
评论
1 楼 joeyon 2011-08-31  
定格  哈哈

相关推荐

    HIBERNATE检索策略

    介绍了HIBERNATE的检索策略,可以此作为指引进行学习

    Hibernate的检索策略

    Hibernate的检索策略包括类级别检索策略和关联级别检索策略。

    hibernate5--4.检索方式及策略

    hibernate5--4.检索方式及策略

    Hibernate学习总结

    学习成长路,Hibernate总结: 1.Hibernate入门优缺点、 2.Hibernate的操作CRUD、 3.主键生成机制、 4.持久化对象的状态、 ...8.Hibernate检索策略(fetch抓取策略)、 9.二级缓存、 10.Hbernate的检索方式(HQL语句)

    hibernate3数据检索、抓取策略 、 注解的使用

    hibernate3数据检索、抓取策略 、 注解的使用

    SSH笔记-检索策略(lazy、fetch、batch-size)

    hibernate的类级别检索策略和检索策略的lazy、fetch、batch-size属性使用

    Hibernate知识点总结

    Hibernate框架知识点的梳理;对HQL检索、检索策略、以及如何配置详细的进行描述

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多和多对多关联的检索策略  16.3.1 立即检索(lazy属性为“false”)  16.3.2 延迟检索(lazy属性为...

    精通hibernate

    Hibernate入门 OR映射技术 通过Hibernate API操纵数据库 检索策略和方式 数据库事务、并发、缓存与性能优化 高级配置。

    Hibernate 对象持久化

    一份我在厦门邦初学习 的快速入门ppt 内容有: 对象持久化基础知识 Hibernate应用开发基础 ...Hibernate的检索策略 Hibernate检索数据的方式 数据库事务与并发处理 组件及组成关系映射 综合项目应用:Struts+Hibernater

    08.拓薪教育-hibernate4.3的hibernate.cfg.xml基本配置.part2

    高级Hibernate4开发技术:ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,...

    Hibernate 课件及源代码

    内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射(1-n、1-1、n-n、继承映射)、检索策略、检索方式(对象导航图、OID 检索、HQL、QBC、本地SQL)、Hibernate 一\二级缓存、...

    Hibernate4学习基础教程(26集)

    内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射、检索策略、检索方式、Hibernate 一\二级缓存、管理 Session、批量处理等 Hibernate 企业级开发的核心技术。

    Hibernate基础教程

    文档内容包括:Hibernate入门、OR映射技术、通过Hibernate API操纵数据库、检索策略和方式、数据库事务、并发、缓存与性能优化、高级配置

    08.拓薪教育-hibernate4.3的hibernate.cfg.xml基本配置.part1

    高级Hibernate4开发技术:ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,...

    hibernate入门与概述

    hibernate入门与概述。介绍对象-关系 映射基础,映射对象标识符,映射一对多关联关系,操纵持久化对象,hibernate的检索策略。

    Hibernate java对象持久化技术.ppt

    Hibernate入门 OR映射技术 通过Hibernate API操纵数据库 检索策略和方式 数据库事务、并发、缓存与性能优化 高级配置

Global site tag (gtag.js) - Google Analytics