关闭

检索策略

标签: ormhibernate
286人阅读 评论(0) 收藏 举报
分类:
1.检索策略目的,是为了提高程序的运行效率
(1) 尽量节省内存开销
       使用不到的数据,尽量不要加载内存中,浪费内存。
(2) 尽量发送少的SQL语句
        能从缓存中获取到的数据,就不要发送语句到数据库中来获取
        能用一条语句查询到的数据,尽量不要使用多条语句进行查询

2.类级别的检索策略
(1) get()
        立即查询
        返回结果:持久化对象或null
(2) load()
        延迟加载
        代理对象或异常或持久化对象(禁用)
(3) 设置类级别延迟加载?
       在<class>标签的lazy属性:
             true : 支持延迟加载.默认值
             false : 禁用延迟加载 ,还可以设置POJO类使用final修饰表示禁用延迟加载。
             Hibernate.initialize(customer):表示如果前面使用的延迟加载,但是后面需要立即用到,我们可以手动初始化POJO对象,Hibernate.initialize(pojo类名),使得变为立即加载。
(4) 延迟加载:推荐使用,提高性能
        延迟加载功能是通过动态代理实现的。
        Hibernate3版本:Cglib动态代理
        HIbernate4版本:Javassist动态代理
        这两种方式都是基于继承的方式实现动态代理的。也就是说,代理类是POJO类的子类。
        注意:POJO类不要使用final来修饰,否则,不能生产子类,也就无法生产代理类,也就无法使用延迟加载功能了。
(5) 延迟加载有效期问题?
        只要涉及延迟加载功能,session一旦关闭,那么,延迟加载就失效了,session失效后再使用延迟加载功能,就会报懒加载异常,也成为 no session异常。
        延长session存活时间,一般是在视图层利用延迟加载功能,展示完数据后,再进行关闭session.  
        具体解决方案:
             ThreadLocal<Session> + Filter 
             ThreadLocal<Session> + Interceptor

3.针对于n的一端的检索策略(一对多或多对多):<set>标签中设置
(1) lazy :
true : 表示支持延迟加载。对关联集合进行延迟加载。默认值。
false : 禁用延迟加载。先发一条查询一的一端,然后再发一条查询多的一端。
extra : 支持延迟加载。获取集合自身属性时,可以发送高效的查询语句。
        例如:查询集合长度,可以发送select count(*) 语句,统计集合长度,而不是将订单对象都查回到内存,再统计。
(2) batch-size :
如果设置了batch-size=5 可以减少发送对关联集合查询的语句条数
查询条件使用in的方式,根据多个用户id查询关联集合,对集合进行初始化;
(3) fetch :  抓取策略
select : 默认值,支持延迟加载。
subselect : fetch属性为subselect使用子查询的方式初始化所有Order集合(忽略batch-size)
join : 采用连接语句进行关联查询。
        延迟加载失效。 设置了<set>标签的fetch="join",对于HQL查询是无效果的。但是对于get()查询是起作用的。

4.针对于1的一端的检索策略(多对一):<many-to-one>/<one-to-one>
(1) lazy : 表示针对于一的一端是否支持延迟加载。
proxy : 支持延迟加载
        no-proxy : 支持延迟加载。但是,不是采用代理机制实现延迟加载的,通过第三方的字节码工具来实现延迟加载功能的.
false :禁用延迟加载。
         如果对端采用fetch="join",对当前端的关联查询是有影响的。
(2) fetch :
     select : 支持延迟加载的。默认值
     join : 表示采用“迫切左外连接”进行关联查询。此时,延迟加载功能失效了。
(3) batch-size :
     <class>标签上设置这个属性:
     表示在关联查询一的一端时,通过批量大小来对一的对象进行初始化,减少对一的一端初始化发送的语句的条数。
1
0
查看评论

Hibernate检索策略与检索方式

Hibernate的Session在加载Java对象时,一般都会把鱼这个对象相关联的其他Java对象也都加载到缓存中,以方便程序的调用。但很多情况下,我们不需要加载太多无用的对象到缓存中,一来会占用大量的内存,二来会增加数据库的访问次数,使得程序的运行效率降低。为了合理的使用缓存,Hibernate...
  • happylee6688
  • happylee6688
  • 2013-12-20 10:58
  • 2485

Java程序员从笨鸟到菜鸟之(六十三)细谈Hibernate(十四)Hibernate三种检索方式详解

Hibernate检索机制中主要分为三种,他们各自有各自的好处和缺点,他主要分为以下三种: 1.立即检索策略  2.延迟检索策略  3.左外连接检索策略  立即加载:首先我们来看一下立即加载         &#...
  • csh624366188
  • csh624366188
  • 2012-05-30 10:55
  • 6660

Hibernate三种检索策略的优缺点对比

1立即检索; 优点:对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象; 缺点:1.select语句太多;2.可能会加载应用程序不需要访问的对象白白浪费许多内存空间; 2延迟检索: 优点:由应用程序决定需要加载哪些对象,可以避免可执行...
  • hw20070575
  • hw20070575
  • 2016-03-07 16:57
  • 392

Hibernate的检索策略-设定检索策略的属性

lazy  可选值:true或false默认值:false用法:如果为true,表示使用延迟检索策略,在和中有这个属性outer-join可选值:auto,true,false默认值:在中是auto,在元素中为false用法:如果为true,表示使用迫切左外连接策略,在元素中包含...
  • ylw620
  • ylw620
  • 2006-05-06 23:48
  • 594

mysql 高性能索引策略

在mysql数据库中,正确的创建索引并且恰当的使用索引,是提高性能的很重要的方面,下面介绍一下如何有效并且高效的使用索引 1.隔离的使用列 在mysql中如果没有隔离创建的索引的列,则建立的所以不会起作用。“隔离”的含义是:他不是表达式的一部分,也没有位于函数中,例如下面的索引就不会起作用 s...
  • jianjun200607
  • jianjun200607
  • 2015-03-12 18:13
  • 360

Hibernate 检索策略的学习

检索数据也就是查询数据的时候存在两个问题: 1.不浪费内存:例如,Customer和Order是双向1-N的关系。当 Hibernate 从数据库中加载 Customer 对象时, 如果同时加载所有关联的 Order 对象, 而程序实际上仅仅需要访问 Customer 对象, 那么这些关联的 Or...
  • u012426959
  • u012426959
  • 2018-01-17 23:42
  • 108

Hibernate 检索策略

     在默认情况下,当Hibernate从数据库中加载对象时,会同时加载所有关联的对象. 但实际应用中可能不需要使用其关联的对象,这样就可能通过设置Hibernate的检索策略,来优化检索性能.    Hi...
  • AppleYang2006
  • AppleYang2006
  • 2007-10-11 11:15
  • 439

检索策略

可以延迟加载的配置组合: ⑴关联实体的载入策略(one-to-one或many-to-one lazy 决定关联实体什么时候载入 (proxy|false) fetch join:使用连接查询检索对象;se...
  • xuchuangqi
  • xuchuangqi
  • 2016-11-07 23:47
  • 127

hibernate框架检索策略之get与load

这篇文章只讨论get和load,因此所有可以设置lazy的地方都不设置,即不考虑lazy的影响 先说一下get和load的区别,下面再通过例子来演示 1.get方法采用立即加载的方式(会立即向数据库发送查询语句),而load方法采用延迟加载的方式(返回的是一个代理对象,此代理对象只有一个id,只有等...
  • sheng_xinjun
  • sheng_xinjun
  • 2017-02-23 11:18
  • 184

Hibernate的检索(抓取)策略

1、 建立模拟数据  ---- 建立3个Customer 和 30个Order(每个客户10个订单) 2、 立即检索和延迟检索          立即检索: 立即加载检索方法指定的对象  &#...
  • u011428274
  • u011428274
  • 2013-07-22 09:31
  • 1173
    个人资料
    • 访问:52291次
    • 积分:2456
    • 等级:
    • 排名:第17754名
    • 原创:190篇
    • 转载:4篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论