Hibernate抓取策略

本文记录Java学习过程中遇到的Hibernate抓取策略~

抓取策略是当应用程序需要在关联关系间进行导航的时候,Hibernate如何获取关联对象的策略。

Hibernate的抓取策略是Hibernate提升性能的一种手段,可以在获取关联对象的时候,对发送的语句进行优化,但是往往抓取策略需要和延迟加载一起使用来提升性能。

延迟加载的分类:

延迟加载(lazy load,懒加载)是Hibernate关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出的。所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。

通常将延迟加载分为两类:一类叫做类级别延迟,另一类叫做关联级别的延迟。类级别的延迟指的是查询某个对象的时候,是否采用有延迟,这个通常在<class>标签上配置lazy属性。关联级别的延迟指的是,查询一个对象的关联对象的时候是否采用延迟加载。这个通常在<set>或<many-to-one>上配置lazy属性。

类级别的延迟加载:

使用load方法查询某个对象的时候,这个类是否采用延迟加载的策略,就是类级别的延迟。类级别的延迟一般在<class>是配置lazy属性,默认值是true。所以,使用load()方法去查询的时候,不会马上发送SQL语句,当真正使用该对象的时候,才会发送SQL语句。

其实,如果不想使用延迟加载也有很多种方法,当然最简单的就是将这个类的映射文件上的lazy设置为false,当然也可以将这个持久类改为final修饰。

关联级别的延迟加载:

关联级别的延迟通常在<set>和<many-to-one>上来进行配置。

<set>标签上的lazy的取值:

  • true:默认值,采用延迟加载;
  • false:不采用延迟加载;
  • extra:极其懒惰的。

<many-to-one>标签上的lazy的取值:

  • proxy: 默认值,是否采用延迟取决于一的一方类上的lazy属性的值;
  • false:不采用延迟加载;
  • no-proxy: 暂不介绍。

抓取策略指的是查询到某个对象的时候,如何抓取其关联对象。可以通过在关联对象的标签(set或many-to-one)上配置fetch属性来配置。

<set>标签上fetch的取值:

  • select:默认值,发送的是普通的select语句;
  • join:发送一条迫切左外连接去查询;
  • subselect:发送一条自查询语句查询其关联对象。

<many-to-one>标签上fetch的取值:

  • select:默认值,发送的是普通的select语句;
  • join:发送一条迫切左外连接语句查询其关联对象。

注意:当fetch设置为join的时候,lazy就失效了。

批量查询:

在抓取的策略中有一种叫做批量抓取,就是同时查询多个对象的关联对象的时候,可以采用批量抓取进行优化。如果要实现批量的抓取效果,可以通过配置batch-size来完成。

  • 一对多的时候,在<set>标签上配置batch-size;
  • 多对一的时候,在class标签上配置batch-size。

标签: none