抓取策略(fetching strategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL或条件查询(Criteria Query)中重载声明。
Hibernate定义了如下几种抓取策略:
1、连接抓取(Join fetching)--Hibernate通过在select语句中使用outer join(外链接)来获得对象的关联实例或者关联集合。这时lazy无效。
2、查询抓取(select fetching)--另外发送一条select语句抓取当前对象的关联实体或集合。除非你显示的指定lazy=false禁止延迟抓取,否则只有当你真正访问关联关系的时候,才会执行第二条select语句。
3、子查询抓取(Subselect fetching)--另外发送一条select语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显示的指定lazy=false禁止延迟抓取,否则只有当你真正访问关联关系的时候,才会执行第二条select语句。
4、批量抓取(Batch fetching)--对查询抓取的优化方案,通过指定一个主键或外键列表,Hibernate使用单条select语句获取一批对象实例或集合。
下面我们通过项目案例来简单了解下这几种策略
java项目结构如下:
该项目所有代码跟上一节《hibernate加载策略之lazy》一样,可以参考。
查询抓取(select fetching)
在多的一端设置fetch
Book.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="Book" table="book">
<id name="id">
<generator class="identity" />
</id>
<many-to-one name="category" class="Category" column="category_id"
cascade="save-update" lazy="proxy" fetch="select"/>
<property name="author" />
<property name="name" column="book_name" />
<property name="price" />
<property name="pubDate" />
</class>
</hibernate-mapping>
在HibernateTest类中添加代码
@Test
public void testLoad1(){
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Book book=(Book) session.get(Book.class, 1);
System.out.println(book.getName());
System.out.println(book.getCategory().getName());
tx.commit();
HibernateUtil.closeSession();
}
断点执行,当执行到
System.out.println(book.getName());
打印sql语句如下
Hibernate:
select
book0_.id as id1_1_0_,
book0_.category_id as category2_1_0_,
book0_.author as author3_1_0_,
book0_.book_name as book_nam4_1_0_,
book0_.price as price5_1_0_,
book0_.pubDate as pubDate6_1_0_
from
book book0_
where
book0_.id=?
当执行到
System.out.println(book.getCategory().getName());
打印sql语句如下
Hibernate:
select
category0_.id as id1_0_0_,
category0_.name as name2_0_0_
from
Category category0_
where
category0_.id&