码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate检索学习

时间:2017-09-17 18:59:38      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:静态方法   覆盖   语句   访问   提高效率   提高   load   empty   hiberna   

Hibernate的检索策略:类级别的检索策略;1对多,多对多的检索策略;多对一,一对一的检索策略

    1.类级别的检索策略,可以通过class元素的lazy属性来设置,该设置只对load方法有效果

    2.1对多,多对多的检索策略(默认开启懒加载):通过set元素的三个属性来控制,查询1方带出n方:lazy定义多方集合初始化的时机;fetch定义查询多方时sql的形式(select/subselect),如果取值为join则定义多方集合初始化的时机,这个会覆盖lazy属性的值,即忽略lazy的设置;batch-size:检索发送sql语句的次数,提高效率

    Lazy属性:通过设置lazy=false,将延长加载变为立即加载。一般不建议这么做,lazy除了可以设置true,false,还可以设置为extra(增强延迟加载),该值可以尽可能的 延迟集合初始化的时机

       当lazy设置为true(默认值,延迟加载),hibernate在以下情况初始化集合代理实例

          1)程序第一次访问集合属性的iterator(),size(),isEmpty(),contains()等方法

          2)通过Hibernate.initialize()静态方法显示初始化 

  ·     当lazy设置为extra(增强延迟加载)时,Hibernate第一次访问集合的iterator()方法时会吃初始化集合代理实例,在调用集合的size(),isEmpty(),contains()方法 的时候并不会初始化集合代理实例,而是通过sql查询必要的信息

     batch-size属性:通过设置batch-size通过改变发送的sql语句(加入in子句)从而来减少发送sql语句的次数:比如1方有4个,那么对于查询n方就要发送4条语句,如果设置了batch-size的值为2,那么查询的时候只会发送2条sql语句

     fetch属性:该属性可以有select(默认),subselect,join三个值,当值 为select按照正常的方式来初始化set元素,如果设置为subselect,将通过子查询一次性初始化所有的set集合(而不是按照batch-size设置的那样),所以这个时候batch-size属性失效。具体的子查询的样子是将1方所有的oid查询出来的sql,作为查询n方in之后的语句即子查询从而一次性查询出所有的n方数据;如果设置为join,则决定set集合初始化的时机,即在加载1方对象的时候使用迫切左外连接(使用左外连接查询的时候同时把set集合初始化了)的方式检索n方的集合属性(这个时候就不是懒加载了),所以这个时候lazy属性失效。注意HQL查询的时候会忽略fetch=join 的取值

     3.多对一,一对一的检索策略:通过设置many-to-one元素的相关属性来控制。查询n方法带出1方

        Lazy属性:这里的lazy属性的取值和上面的不一样,为proxy(默认的表示使用延迟加载),和false(表示不适用延迟加载)。

        fetch属性:设置为join时,同样会在查询n方式用迫切左外连接查询出1方集合的属性值(不再是延迟加载)这个时候同样会忽略lazy的设置

        batch-size属性:这个时候该属性需要设置在1方的class属性上,才会起作用。比如利用hql查询出所有的n方数据,遍历n方集合查询出1方数据,如果查询1方数据需要3条语句,这个时候设置 batch-size=2,则只要发送2条sql语句即可。原理也是通过在添加in子句

 

Hibernate检索学习

标签:静态方法   覆盖   语句   访问   提高效率   提高   load   empty   hiberna   

原文地址:http://www.cnblogs.com/wanjn/p/7536351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!