Hibernate的抓取策略指的是当应用程序需要在关联关系间(表与表之间)进行导航的时候, Hibernate如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明(eg:hbm.xml),也可以在特定的HQL 或条件查询(Criteria Query)
中重载声明。
抓取策略:大的方面有两类 selete 和 join
用一对多来举例:
fetch = "select"是在查询的时候先查询出一端的实体,然后在根据一端的查询出多端的实体,会产生1+n条sql语句;
fetch = "join"是在查询的时候使用外连接进行查询,不会差生1+n的现象。
在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定join fetch某个关联对象。
通常情况下,我们并不使用映射文档进行抓取策略的定制。更多的是,保持其默认值,然后在特定的事务中, 使用HQL的左连接抓取(left join fetch) 对其进行重载。这将通知 Hibernate在第一次查询中使用外部关联(outer join),直接得到其关联数据。 在条件查询 API中,应该调用 setFetchMode(FetchMode.JOIN)语句。
Hibernate推荐的做法也是最佳实践:把所有对象关联的抓取都设为lazy!然后在特定事务中进行重载。
这种考虑是基于:对象之间的关联式错综复杂的,有时候哪怕我们只是一个简单的load,也会导致很多对象被load出来!所以在Hibernate中,所有对象关联都是lazy的