Hibernate中的检索策略

  前边我们讲过了如何用hbm.xml文件中的subclass joined-subclass  union-subclass描述Java中类与类之间的继承关系。当采用subclass节点时,对Java中的继承关系在数据库中表示子类和父类使用同一张表来存储数据记录,表中须额外的有一个辨别者列指定当前记录是属于父类还是子类,且子类的独有字段不可以有非空约束,以防止父类对象数据出入不进来。当采用joined-subclass时,表示子类的实例的数据存在两张表格中,在父类的共有属性存于父类表中,子类的独有属性存于子类表中,好处是每个子类都有独立的表,且子类字段可添加非空约束。当采用union-subclass时,表示将父类或者子类的每个实例对象映射到每一个独立的表中,是最符合我们想法的方式,但需要注意的是字表中存在冗余字段,且此方法的id生成器不可以是identify(数据库自增)。以上三种映射Java类中继承关系的方法,由于subclass中字表的独有字段不允许有非空约束,所以我们不采用,常用joined-subclass  和union-subclass,但需要注意的是,真正开发时,也是很少来映射Java中继承关系的,所以这个知识点了解就好。

  今天我们来讲一讲Hibernate的检索策略。

  1.检索策略

  检索即查询,就是指Hibernate的查询时发送的SQL的时机,方式和数量。

  2.检索时的原则

  ① 不浪费内存:如当只需要查询某个对象时却将其关联的外键的对象也查询出来了,就浪费了内存。lazy

  ② 更高的查询效率:更高的效率体现在发送尽可能少的SQL。batch-size

  3.类级别的检索策略

  立即检索:立即检索方法指定的对象。当程序加载对象的目的是为了访问它的属性,可用立即检索

  延迟检索:延迟检索方法指定的对象。(可能会发生懒加载异常)当程序加载一个持久化对象是为了获取它的引用,可用延迟检索

  类级别的检索策略,可以使用class节点的lazy属性来设定,默认是true,即采用延迟加载的方式。需要注意的是,class节点的lazy属性仅仅对load方法起作用,对其他的get或者HQL,QBC等不起作用。

  所以一般不在class节点改变默认的lazy属性,因为作用范围小仅作用于load方法且易发生懒加载异常

  4.set节点级别的检索策略

  我们知道hbm.xml中的set节点描述的是Java类中的集合属性的映射,而当某个类中存在另一个类的集合属性时,说明二者的关系只可能是我们前边描述的双向一对多和双向多对多的关联关系。针对这个描述双向一对多和双向多对多的set集合,我们下边来详细的描述他的三个与检索策略相关的属性

  ① lazy-----决定加载关联对象的时机

  这个属性决定了被关联对象的检索的时机,即决定了是在当前对象被加载时就进行关联加载还是当使用到此对象的属性时再进行加载。

  取值为true时,默认值,表示在使用到被关联对象的属性或者方法时才进行加载

  取值为false,表示不进行懒加载,一股脑将所有的被关联对象全部查出来(基本不用)

  取值为extra,表示是增强型懒加载,我们可以使用对象的size或者contains等方法而不加载对象,只有当使用到对象的属性时发送SQL将对象加载到内存中。即尽可能的延迟对象集合的加载时机。

  ② batch-size-----决定一次性加载关联对象的数目

  这个值表示一次性初始化对象集合的数量,SQL中显示采用了in(。。。。)来初始化多个集合。可以有效的减少向数据库发送的select语句的数目,提高延迟检索个立即检索的性能。

  ③ fetch---决定加载关联对象的时机和数目

  这个fetch属性可以说是前边lazy和batch-size的更高级的总结,既可以决定关联对象加载的时机(此时忽略lazy属性),也可以决定关联对象加载的数目(此时忽略batch-size属性)

  取默认值select,表示正常加载

  取默认值subselect,表示在SQL中会记性子查询,一次性的将所有的关联对象的集合全部查出来并且初始化。可知它会忽略batch-size属性,但是lazy属性依然有效。

  取默认值join,表示在查询当前对象时,会将集合属性的对象查出来。可知它会忽略lazy属性,但是batch-size属性依然有效。

 

 








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值