Hibernate的抓取策略是指当应用程序需要在实体对象的关联关系间进行导航的时候,如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明,可以在特定的HQL语句中声明。
抓取策略分为了四种:
1、连接抓取:Hibernate通过在SELECT语句使用OUTER JOIN来获得对象的关联实例或者关联集合。
2、查询抓取(Selectfetching)另外发送一条SELECT语句抓取当前对象的关联实体或集合,如果设置lazy=”false”,可以禁止延迟抓取,其他情况只有当真正访问关联关系的时候才会执行第二条select语句。
3、子查询抓取:发送的SELECT语句抓取的是前面查询到的所有实体对象的关联集合。
4、批量抓取(Batchfetching):这是对查询抓取的优化方案,通过制定一个主键或外键列表,获取一批对象实例或集合。
下面我们详细介绍其中几种抓取策略的方式:
单端代理抓取策略:单端关联的实体必须采用代理,这样Hibernate在运行期会为持久化对象实现延迟载入代理,在多对一的关联映射中,我们需要设置多的一端采用单端 代理的抓取策略,在映射文件中:
<many-to-one name="classes"column="classesid" fetch="select"/>设置fetch为select会另外发送一条select语句加载当前对象的关联对象或者集合。同样如果我们设置fetch=”join”, hibernate会通过一个select语句连接(内联/外联)抓取其关联对象或集合,而且lazy延迟失效。
集合代理抓取策略:在Session范围之外访问未初始化的集合或代理,Hibernate将会抛出 LazyInitializationException异常。我们需要保证某个代理或者集合在Session关闭前就已经被初始化了,此时引入了集合代理的抓取策略。在一对多的关联映射中,我们在一的一端的set标签中设置fetch=”select”,来表示采用集合代理的批量抓取,会另外发送一条select语句加载当前对象的关联对象或者集合。当然和单端代理一样,如果设置fetch=”join”, hibernate会通过一个select语句连接(内联/外联)抓取其关联对象或集合,而且lazy延迟失效。如果设置fetch=”subselect”,会另外发送一条select语句加载当前对象的关联对象或者集合,但是这种方式会影响hql语句。
不管是单端代理还是集合代理,设置fetch=”select”或者”join”,不会影响hql语句,影响的是load和get方法。
批量抓取策略:
batch-size批量抓取可以设置在<class>标签上还可以设置在<set>集合标签上。
Hibernate中的抓取策略是用来优化程序,提高程序的执行效率,以抓取策略入门,主键深入我们的Hibernate的优化之路。