接着上一篇.hibernate的get()和load()介绍一
其实,get()和load()的实现机制也是不一样的,当然这是更深层次的东西,get()查出来的就是当前对象,如果数据库没有数据,那么get()返回的值是空,所以,如果对返回值做操作时,我们要注意空指针了.
load()是延迟装载,等到你用的时候在查询,那么是说我们执行方法什么都不做吗?不是的,load()用的一个代理,执行方法是产生一个代理,这里应该用到了代理的设计模式,并且会创建一个监听,如果任何方法调用了监听,那么,监听触发,进行load()装载.
解决上一个问题,session关闭,load()报错怎么办?
hibernate给出的答案是另一种session————currentSession;
简答说下,正常的session,也就是我们上一篇说到的session,用的时候打开,不用的时候,或者是执行完毕的时候直接关闭,但是currentSession是请求过来打开,到请求结束,响应返回,currentSession关闭,这样,在这个请求中,你随便load().
具体配置:
web.xml重配置
<filter>
<filter-name>openSession</filter-name>
<!--请求来的时候打开session-->
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBean</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<!--单例的session,保证资源的不良费-->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<!--自动刷新缓存-->
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
<!--截听一切访问并进入session配置-->
<filter-mapping>
<filter-name>openSession</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
currentSession的创建工厂:
public class SessionDaoSupport<T> {
private SessionFactory sessionFactory;
public final void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
//创建getCurrentSession
public Session currentSession()
{
return sessionFactory.getCurrentSession();
}
}
使用的时候只要继承这个就可以使用了.