【Hibernate的检索策略】

来源:互联网 发布:linux安装图形界面 编辑:程序博客网 时间:2024/04/25 12:46
类级别的检索策略
类级别的检索策略包括立即检索和延迟检索,默认为延迟检索。
如果程序加载一个持久化类对象的目的是为了访问它的属性,可以使用立即检索。
如果程序加一个一个持久化对象的目的仅仅是为了获得它的引用,可以使用延迟检索。
立即检索

延迟检索

一对多和多对多关联的检索策略
立即检索
延迟检索
增强延迟检索
批量延迟检索和批量立即检索
用带子查询的select语句整批量初始化orders集合
迫切做外连接检索

多对一和一对一关联的检索策略
立即检索
延迟检索
增强延迟检索
批量延迟检索和批量立即检索
用带子查询的select语句整批量初始化orders集合
迫切做外连接检索

类级别的检索策略:load、get、list

关联 

类级别的检索策略
类级别的检索策略包括立即检索和延迟检索,默认为延迟检索。
如果<class>元素的lazy属性为true,表示采用延迟检索。如果lazy属性为false,则表示立即检索。lazy属性的默认值为true。
<class name="cn.it.domain.Customer" table="customers" lazy="true">
如果程序加载持久化对象的目的是为了访问它的属性,可以采用立即检索。如果仅仅是为了获得它的引用,可以采用延迟检索。

Customer c=(Customer)session.load(Customer.class, 1);//默认延迟加载,返回代理类对象。id为1,其余值为nullc.getId();        //不会执行select语句。直接从代理对象中获取id值c.getAge();     //执行select语句,检索数据,完成代理类实例的初始化
①假设以上采用默认的延迟加载。当执行load方法时,不会执行select语句,仅返回Customer代理类实例。该代理类是由Hibernate在运行时采用cglib工具动态生成的,它继承了Customer类的所有属性和方法,但它的实现对于应用程序是透明的。
Hibernate创建该代理类实例时,仅初始化它的OID属性,其它属性都为null。因此,这个代理类占用的内存很少。
②当访问代理类实例的getId()时,不会初始化代理类实例。因为在创建代理类实例时OID已经存在了,直接获取就行了,没必要到数据库中获取。
③访问getXXX方法时,hibernate会初始化代理类实例。在初始化过程中,会发送select语句,加载Customer对象的所有数据。

注意:无论 <class> 元素的 lazy 属性是 true 还是 false, Session 的 get()方法及 Query 的 list()方法在类级别总是使用立即检索策略


关联检索策略





0 0