• hibernate的延迟加载及其与session关闭的矛盾


    延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。

        那么Hibernate是怎么知道用户在什么时候使用数据了呢?又是如何加载数据呢?

        其实很简单,它使用了代理机制。返回给用户的并不是实体本身,而是实体对象的代理。代理对象在用户调用getter方法时就会去数据库加载数据。

        但加载数据就需要数据库连接。而当我们把会话关闭时,数据库连接就同时关闭了。这种情况就叫做未初始化的关系。

        延迟加载与session关闭的矛盾一般可以这样处理:

        1)、关闭延迟加载特性。     操作起来比较简单,因为hibernate的延迟加载特性是在hbm配置里面可控制的。默认lazy="true",改为lazy="false"就可以了。     但是使用这个解决办法带来的隐患是十分大的。     首先,出现no session or session was closed就证明了您已经在使用外键关联表,如果去掉延迟加载的话,则表示每次查询的开销都会变得十分的大,如果关联表越多,后果也可以想象得到。所以不建议使用这个方法解决。

        2)、在session关闭之前把我们想要查询的数据先获取了。 首先需要了解一下session什么时候关闭,也就是它的生命周期。通常情况下hibernate会在查询数据关闭session,而使用getHibernateTemplate().get方法查询后会延迟关闭的时间。会在事务结束后才关闭。     使用拦截器(Interceptor)或过滤器(Filter)控制session。     spring为解决hibernate这一特性提供的解决方案,可以有效的控制session生命周期。

        因为还没有讲到Spring,课堂上用过滤器(Filter)来控制session。

        首先建个类OpenSessionInViewFilter继承Filter,重写doFilter方法,在try,finally中编写session的获得和关闭。实例代码如下:

    public void doFilter(
            ServletRequest arg0, 
            ServletResponse arg1,
            FilterChain chain) 
                           throws IOException,   ServletException {
            try {
                HibUtil.getSession();
                chain.doFilter(arg0, arg1);
            } finally {
                HibUtil.closeSession();
            }
    }

        然后在web.xml配置文件中增加相关配置,例如:

    <filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>
            tarena.util.OpenSessionInViewFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>*.action</url-pattern>
     </filter-mapping>

        最后要记得修改service层事务处理的代码,把关闭session的代码注释掉。

  • 相关阅读:
    爬虫笔记之JS检测浏览器开发者工具是否打开
    上海租房@8群
    在Windows中玩转Docker Toolbox(镜像加速)
    Docker 清理命令 删除所有的镜像和容器
    修改docker安装的machine位置
    Sass @mixin 与 @include
    webpack之SourceMap
    c#中Indexof()和Split()的用法
    《MVC+EF》——用DBFirst创建ADO.NET实体数据模型和对象关系映射
    sql server 用户'sa'登录失败(错误18456)
  • 原文地址:https://www.cnblogs.com/wzh123/p/3936843.html
Copyright © 2020-2023  润新知