hibernate种级别的检索策略

hibernate类级别的检索策略

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类级别总是使用立即检索策略。