Hibernate高级-笔记01-类级别检索策略
目录
- 检索策略简介
- 类级别立即加载
- 类级别延迟加载
0. 检索策略简介
在Hibernate中,Session主要有两种检索方法:get()和load(),这两个方法都是用来从数据库中检索对象,并按照参数指定的对象标识符OID来加载一个持久化对象。
【示例】
Customer customer1 = session.get(Customer.class, 1); //检索OID为1的Customer对象
Customer customer2 = session.load(Customer.class, 2); //检索OID为2的Customer对象
检索策略主要有以下两种:
-
类级别检索策略
使用Session的load()或get()方法进行检索,对当前对象直接检索该对象本身。类级别加载又分为- 立即加载
- 延迟加载
-
关联级别检索策略
使用Session的load()或get()方法或使用HQL进行检索,对当前对象的关联对象进行检索。关联检索分为:- 立即加载
- 延迟加载
- 预先抓取
get()方法和load()方法的区别
get()方法和load()方法的区别在于对二级缓存的使用上。
- load()方法会使用二级缓存,对使用了二级缓存的对象查询时最好使用load()方法,以充分利用二级缓存来提高检索效率。
- get()方法在一级缓存没有找到的情况下会直接查询数据库,不会去二级缓存中查找。
1. 类级别立即加载
类级别加载默认级别就是类级别立即加载
【示例】
在XXX.hbm.xml文件中配置,加入属性 lazy="false"
或者不加(默认情况就是立即加载)
<class name="com.chapter07.pojo.Customer" table="t_customer" lazy="false" schema="course_s2sh">
或
<class name="com.chapter07.pojo.Customer" table="t_customer" schema="course_s2sh">
【测试代码】
/**
* 测试类级别立即加载
*/
@Test
public void testClassLoad(){
Session session = HibernateUtil.getSession();
//检索id=2的Customer数据
Customer customer = session.load(Customer.class, 2);
String username = customer.getUsername();
System.out.println("username = " + username);
}
//控制台输出
/*
Hibernate:
select customer0_.id as id1_0_0_,
customer0_.username as username2_0_0_,
customer0_.password as password3_0_0_,
customer0_.address as address4_0_0_
from t_customer customer0_
where customer0_.id=?
//out
username = 张三
*/
当通过Session的load()方法加载对象时,Hibernate会立即执行查询t_customer表的select语句。
因此,立即加载是指宿主对象被加载时,其所关联的对象也会被立即加载。
2. 类级别延迟加载
【示例】
在XXX.hbm.xml文件中配置,加入属性 lazy="true"
<class name="com.chapter07.pojo.Customer" table="t_customer" lazy="true" schema="course_s2sh">
【代码示例】
/**
* 测试类级别延迟加载
*/
@Test
public void testClassLazyLoad(){
Session session = HibernateUtil.getSession();
//检索id=2的Customer数据
Customer2 customer2 = session.load(Customer2.class, 2);
//调用了getXXX()方法
String username = customer2.getUsername();
System.out.println("username = " + username);
}
//控制台输出
/*
Hibernate:
select customer2x0_.id as id1_0_0_,
customer2x0_.username as username2_0_0_,
customer2x0_.password as password3_0_0_,
customer2x0_.address as address4_0_0_
from t_customer customer2x0_
where customer2x0_.id=?
//out
username = 张三
*/
当执行load()方法时,Hibernate不会立即执行select语句对数据库查询,而是返回Customer类的代理类的实例,当调用该实例的getXXX()/setXXX()等方法(getId()方法除外)时,Hibernate才真正从数据库加载Customer对象的数据。