Hibernate检索策略:
立即检索、延迟检索、迫切左外连接检索
Hibernate检索策略应用对象级别
类级别、关联级别
以下表格为类级别和关联级别可选的检索策略及默认的检索策略
检索策略的作用域 | 可选的检索策略 | 默认的检索策略 | 运行时行为受影响的Session的检索方法 |
类级别 | 立即加载 延迟加载 | 立即检索 | Load()方法 |
关联级别 | 立即加载 延迟加载 迫切左外连接检索 | 多对一或者一对一为迫切左外连接检索 一对多或者多对多为立即检索 | Get()、Load()、Find()方法 |
以下表格为用于在对象-关系映射文件中设定检索策略的属性
属性 | 可选值 | 默认值 | 描述 |
lazy | true、false | false | 如果为true表示使用延迟加载,如果为false表示使用立即加载 |
outer-join | auto、true、false | 在<many-to-one>元素和 <one-to-one>元素中为auto,在<one-to-many>元素和<many-to-many>元素中为false
| 如果为true表示使用迫切左外连接检索。在<many-to-one>、<one-to-one>、和<set>元素中包含此属性 如果为false表示使用立即加载 |
batch-size | 正整数 | 1 | 设定批量检索的数量。如果设定此项合理的取值在3-10之间 |
一、类级别的检索策略:
Session的Load()、Get()、Find()方法受到检索策略的影响
Load()方法的立即检索:立即查询数据库并初始化类实例,查询不到是抛异常
Load()方法的延迟检索:不检索数据库只返回类的代理实例,举例说明一个Custom类
当Custom类通过Session.Load()方法延迟加载持久化对象时,只是将Custom对象的对象标识赋值,并没有操作数据库;当我们访问这个对象的标识属性时也只是简单返回对象标识,并不操作数据库。而当我们访问Custom对象的其它属性时由于没有初始化,所以要检索数据库并赋值给该属性。这个时候要保证此对象的Session连接时正常的。
Get()方法的检索策略:只有立即加载策略。查询不到返回null
Find()方法的检索策略:只有立即加载策略。
如果我们在使用Session的Load()、Get()、Find()方法时并不知道检索策略,我们可以在调用这些方法后立即执行以下代码来初始化持久化对象:
If( !Hibernate.isInitialized(customer))
{
Hibernate.initialize(customer);
}
二、关联级别的检索策略
一对多和多对多关联的检索策略
lazy属性 | outer-join属性 | 检索策略 |
false | false | 采用立即检索,这是默认的检索策略,当使用Hibernate的第二级缓存时,可以考虑采用立即检索。 |
true | false | 采用延迟检索 |
false | true | 采用迫切左外连接检索,对于Hibernate2.0以下,再映射文件中如果有多个<set>元素,只允许有一个<set>元素的outer-join属性为true |
true | true | 没有任何意义 |
注意:对于Session.find()方法会忽略迫切左外连接检索,采用立即检索策略
多对一和一对一关联的检索策略
Order对象与Custom对象之间的多对一关系
Order.hbml.xml的 <many-to-one>元素的 outer-join属性 | Custom.hbm.xml的<class>元素的lazy属性 | 检索order对象时对关联的custom对象使用的检索策略 |
auto | true | 延迟检索 |
auto | false | 迫切左外连接检索 |
true | true | 迫切左外连接检索 |
true | false | 迫切左外连接检索 |
false | true | 延迟检索 |
false | false | 立即检索 |
批量检索:
设置<class>元素的batch-size,这样再进行查询时能够在Sql中采用or连接词,减少查询次数。