hibernate类级别的检索策略

来源:互联网 发布:数据有效性是什么意思 编辑:程序博客网 时间:2024/06/08 04:47

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


原创粉丝点击