[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);
}
}
类级别的可以用立即检索和延迟检索
关联级别可用以上三种。
延迟检索的原理是动态生成要检索的类的代理类的实例,这个代理类继承了要检索的类,有相关的类信息等,并且之初始化它的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);
}
}