`

hibernate之检索策略与检索方式

 
阅读更多
检索策略包括 立即检索 延迟检索 迫切左外连接

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

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

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

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

检索方式

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对应的记录,则抛出异常。(个人认为是因为load要建立查询对象的代理对象
get:没有则返回null
GET方法源码 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);
success = true;
return event.getResult();
}
finally {
afterOperation(success);
}
}


LOAD方法源码
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 );
if ( event.getResult() == null ) {
getFactory().getEntityNotFoundDelegate().handleEntityNotFound( entityName, id );
}
success = true;
return event.getResult();
}
finally {
afterOperation(success);
}
}










分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics