1、立即检索
在School.hbm.xml文件中,以下表示采用立即检索策略:
<class name="School" table="school" lazy="false">
当采用Session的load方法检索School对象时:
School school = (School)session.load(School.class,new Long(1));
hibernate会理解查询school表的select语句:
select * from school where id=1;
2、延迟检索
类级别的默认检索策略为延迟检索。在School.hbm.xml文件中,以下两种方式都表示采用延迟检索策略
<class name="School" table="school">
或者
<class name="School" table="school" lazy="true">
当执行上诉的session的load方法时,hibernate不会立即执行school表的select语句,仅返回School类的代理实例,这个代理类具有以下特征:
a)由hibernate在运行时同台生成,它扩展了School类,因此它继承了School类的所有属性和方法,但它的实现对于应用程序是透明的。
b)当hibernate创建School类的代理类实例时,仅初始化了它的OID属性,其他的属性都为null,因此这个代理类实例占用的内存很少。
c)当应用程序第一次访问School代理类的实例的属性时(school.getId()除外,原因应该都知道),hibernate会自动初始化代理类实例。在初始化过程中执行select语句,真正从数据库中加载School对象的所有数据。
注意:School代理类的实例只有在当前Session范围内才能被初始化。
org.hibernate.Hibernate类的initialize()静态方法用于在session范围内显示初始化代理类实例,isInitialized()方法用于判断代理类是否已经被初始化。例如:
tx = session.beginTransaction();
School school = (School)session.load(School.class,new Long(1));
...
if(!Hibernate.isInitialized(school)){
Hibernate.initialize(school);
}
tx.commit();
session.close();
String name = school.getName();//正常执行
注意:不管School.hbm.xml文件的<class>元素的lazy属性是true还是false,Session的get()方法及Query的list()方法在School类级别总是使用立即检索策略。