hibernate的检索策略
2016-04-13 21:07
246 查看
1.立即检索和延迟检索(懒加载)
立即检索: 立即加载检索方法指定的对象
延迟检索: 延迟加载检索方法指定的对象
增强延迟: 极其懒惰,只查询需要的,不会查询别的(lazy=extra)
<class name=”cn.itcast.Customer” table=”customers” lazy=”true”>
* class元素lazy=true: 为延迟加载
* class元素lazy=false: 为立即检索
代码演示:
Customer customer = (Customer)session.load(Customer.class,1); // 如果lazy=false,那么当执行到这个位置产生select语句
System.out.println(“*********”);
customer.getAge(); // 如果lazy=true, 那么当执行到这个位置才产生select语句
为什么要使用延迟检索???
在hibernate中,当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少系统资源的消耗,这时我们可以使用hibernate
懒加载机制来缓解这种缺陷.所谓的懒加载,就是它在查询的时候不会立刻访问数据库,而是返回代理兑现,当真正去使用对象的时候才会访问数据库
注意: 不管lazy的值是true还是false, session.get()方法和query.list()方法永远是立即检索
使用懒加载的目的: 提高性能,不要总是和数据库打交道!!!
2.延迟检索中的代理
* 只有延迟检索才会产生代理对象
* hibernate会为产生的代理对象分配一个OID,但其他的属性不分配值,此时还没有查询
代码演示:
Customer c=(Customer)session.load(Customer.class, 1);
System.out.println(c.getClass()); // 代理对象
c.getClass(); // hibernate不会执行select语句
c.getId(); // hibernate不会执行select语句
c.getAge(); // 该行hibernate会执行select语句
if(!Hibernate.isInitialized(c)){
Hibernate.initialize(c); // 初始化代理对象, hibernate执行select查询
}
3.类级别和关联级别
* 查询Customer对象
Customer c = (Customer) session.load(Customer.class,1); -- 类级别
* 查询Customer对象对应的订单集合
c.getOrders() -- 关联级别
4.关联级别的检索策略
* 如果fetch的值为join lazy=”true/false/extra”,使用get方法查询Customer关联的订单集合,总是使用迫切左外连接
* 如果fetch的值为join lazy=”true/false/extra”,
* lazy=”false” 立即检索客户关联的订单集合
* lazy=”true” 延迟检索客户关联到的订单集合
* lazy=”extra” 增强延迟检索客户关联到订单集合(要什么查什么)
5.多对一关联的检索策略
* <many-to-one> 元素也有一个lazy属性和fetch属性 <many-to-one fetch=”join” lazy=”false”>
fetch=”join”
* 如果使用get方式检索, lazy=”false/proxy/no-proxy” 总是使用迫切左外连接检索
* 如果使用query方式检索:
* lazy=”false” 这时不再采用左外连接检索,而是采用立即检索, 先查询订单,再通过订单的表的外键id查询客户
fetch=”select”
* lazy=”false” 立即检索(先查询订单,再通过订单的外键查询客户)
* lazy=”proxy”
* 对端的class元素中的lazy=”false”,立即检索
<class name=”cn.itcast.Customer” table=”customers” lazy=”false”>
* 对端的class元素中的lazy=”true”,延迟检索
<class name=”cn.itcast.Customer” table=”customers” lazy=”true”>
6. get和load方法区别
相同点: 都是通过id查询对象
不同点:
如果id在数据库中不存在,get返回null, load抛出异常
get方法总是立即加载(不管配置的lazy=false还是lazy=true),
load可以配置延迟和立即两种load查询,返回不是一个javaBean对象,而是一个javaBean对象的代理Proxy,
那我们何时使用Load???
一般情况下,如果一个表很少修改且确定此条记录存在的情况下, 才可以使用load.
立即检索: 立即加载检索方法指定的对象
延迟检索: 延迟加载检索方法指定的对象
增强延迟: 极其懒惰,只查询需要的,不会查询别的(lazy=extra)
<class name=”cn.itcast.Customer” table=”customers” lazy=”true”>
* class元素lazy=true: 为延迟加载
* class元素lazy=false: 为立即检索
代码演示:
Customer customer = (Customer)session.load(Customer.class,1); // 如果lazy=false,那么当执行到这个位置产生select语句
System.out.println(“*********”);
customer.getAge(); // 如果lazy=true, 那么当执行到这个位置才产生select语句
为什么要使用延迟检索???
在hibernate中,当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少系统资源的消耗,这时我们可以使用hibernate
懒加载机制来缓解这种缺陷.所谓的懒加载,就是它在查询的时候不会立刻访问数据库,而是返回代理兑现,当真正去使用对象的时候才会访问数据库
注意: 不管lazy的值是true还是false, session.get()方法和query.list()方法永远是立即检索
使用懒加载的目的: 提高性能,不要总是和数据库打交道!!!
2.延迟检索中的代理
* 只有延迟检索才会产生代理对象
* hibernate会为产生的代理对象分配一个OID,但其他的属性不分配值,此时还没有查询
代码演示:
Customer c=(Customer)session.load(Customer.class, 1);
System.out.println(c.getClass()); // 代理对象
c.getClass(); // hibernate不会执行select语句
c.getId(); // hibernate不会执行select语句
c.getAge(); // 该行hibernate会执行select语句
if(!Hibernate.isInitialized(c)){
Hibernate.initialize(c); // 初始化代理对象, hibernate执行select查询
}
3.类级别和关联级别
* 查询Customer对象
Customer c = (Customer) session.load(Customer.class,1); -- 类级别
* 查询Customer对象对应的订单集合
c.getOrders() -- 关联级别
4.关联级别的检索策略
* 如果fetch的值为join lazy=”true/false/extra”,使用get方法查询Customer关联的订单集合,总是使用迫切左外连接
* 如果fetch的值为join lazy=”true/false/extra”,
* lazy=”false” 立即检索客户关联的订单集合
* lazy=”true” 延迟检索客户关联到的订单集合
* lazy=”extra” 增强延迟检索客户关联到订单集合(要什么查什么)
5.多对一关联的检索策略
* <many-to-one> 元素也有一个lazy属性和fetch属性 <many-to-one fetch=”join” lazy=”false”>
fetch=”join”
* 如果使用get方式检索, lazy=”false/proxy/no-proxy” 总是使用迫切左外连接检索
* 如果使用query方式检索:
* lazy=”false” 这时不再采用左外连接检索,而是采用立即检索, 先查询订单,再通过订单的表的外键id查询客户
fetch=”select”
* lazy=”false” 立即检索(先查询订单,再通过订单的外键查询客户)
* lazy=”proxy”
* 对端的class元素中的lazy=”false”,立即检索
<class name=”cn.itcast.Customer” table=”customers” lazy=”false”>
* 对端的class元素中的lazy=”true”,延迟检索
<class name=”cn.itcast.Customer” table=”customers” lazy=”true”>
6. get和load方法区别
相同点: 都是通过id查询对象
不同点:
如果id在数据库中不存在,get返回null, load抛出异常
get方法总是立即加载(不管配置的lazy=false还是lazy=true),
load可以配置延迟和立即两种load查询,返回不是一个javaBean对象,而是一个javaBean对象的代理Proxy,
那我们何时使用Load???
一般情况下,如果一个表很少修改且确定此条记录存在的情况下, 才可以使用load.
相关文章推荐
- 最小生成树 Kruskal 算法 和 Prim算法
- cookie和session
- 第四次作业
- 找出二维数组中的最长路径(最长链表)
- Java-并发入门
- AX 查询表字段的Lable
- 史上最全的java随机数/字符串生成算法(转)
- android--View自定义基础
- JVM与GC
- 添加回文串
- ZooKeeper系列之二:Zookeeper常用命令 .
- Github+Jekyll —— 创建个人免费博客(三)Git学习
- 应用程序中的错误处理
- JSR250
- 史上最全的java随机数/字符串生成算法(转)
- 【转】透视矩阵详解
- ECUST Windows + Office
- 操作系统设计与实现 第一章 引言(四)
- CodeForces - 660B Seating On Bus (模拟)水
- httpClient中的三种超时设置小结