hibernate之检索策略与检索方式

本文详细介绍了Hibernate中的检索策略,包括立即检索、延迟检索及其增强方式,并对比了load与get方法的区别,深入探讨了它们在Hibernate中的实现机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[color=red]检索策略[/color]包括 立即检索 延迟检索 迫切左外连接

类级别的可以用立即检索和延迟检索
关联级别可用以上三种。

延迟检索的原理是动态生成要检索的类的代理类的实例,这个代理类继承了要检索的类,有相关的类信息等,并且之初始化它的OID属性(即查询条件),其他属性皆为null,这样占用很少内存。
可以用Hibernate的静态方法initialize()在session范围内来显式的初始化。
if(!hibernate.isinitialized())
Hibernate.initialize(obj)
这样在session关闭后就可以用obj实例的get等方法。

有点需要注意的就是:
不论配置的lazy是否是true,session的get方法,query的list方法总是立即检索该对象(但是不会立即检索关联对象)。

增强延迟检索:。。。。。。

[color=red]检索方式[/color]

HQL QBC(query by critiera) QBE(query by exampl)

QBC的分页查询:setFirstResult setmMaxresult
检索大哥对象:uniqueResult
HQL QBC 设置清理缓存模式 setFlushMode()
设置与session二级缓存的交互模式setCacheMode(读取,写入,刷新,正常,忽略)

还可以在映射文件中定义命名查询语句,并用session.getnamedquery("asd")来调用。

load与get方法的区别:
load:如果数据库中不存在与OID对应的记录,则抛出异常。([color=red]个人认为是因为load要建立查询对象的代理对象[/color])
get:没有则返回null
[color=red]GET方法源码[/color] public Object get(String entityName, Serializable id) throws HibernateException {
LoadEvent event = new LoadEvent(id, entityName, false, this);
boolean success = false;
try {
fireLoad(event, LoadEventListener.GET);
[color=red] success = true;
return event.getResult();[/color] }
finally {
afterOperation(success);
}
}


[color=red]LOAD方法源码[/color]
public Object load(String entityName, Serializable id) throws HibernateException {
LoadEvent event = new LoadEvent(id, entityName, false, this);
boolean success = false;
try {
fireLoad( event, LoadEventListener.LOAD );
[color=red] if ( event.getResult() == null ) {
getFactory().getEntityNotFoundDelegate().handleEntityNotFound( entityName, id );
}
success = true;
return event.getResult();[/color] }
finally {
afterOperation(success);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值