zoukankan      html  css  js  c++  java
  • hibernateTemplate的load方法

    hibernateTemplate的load方法采用延迟加载,所以应当注意。

    如果配置不当,采用此方法获取对象,往往会出现异常:

    javax.servlet.ServletException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    出现此异常一般是因为session已关闭,无法获取对象。

    测试代码:

    以下是部门的实现类DeptDaoImpl的一个方法——通过部门id获取指定部门

    public Dept findById(int did) {
            return hibernateTemplate.load(Dept.class, did);
        }

    以下是DeptService中相应的方法

    public Dept findById(int id){
            return deptDaoImpl.findById(id);
        }

    测试类测试此方法,出现异常:javax.servlet.ServletException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    分析:为什么此处会出现异常呢?这是因为执行Dept d= deptService.findById(156);这一句后session已关闭,且因为在DeptDaoImpl采用的load的方法——延迟加载,它并不会从数据库中加载id为156的这个部门,因此执行System.out.println(d.getDname());出现此异常。

    @Test
        public void getDeptById(){//load
            //error
            Dept d= deptService.findById(156);
            System.out.println(d.getDname());
        }

    下面将 System.out.println(d.getDname());这句代码放在DeptService进行测试

    public void test(int id){
            Dept d=deptDaoImpl.findById(id);
            System.out.println(d.getDname());
        }

    成功,打印信息:

    技术部

    分析:为什么能在DeptService能够获得指定部门的部门名称呢?

    ——这是因为在spring的配置文件中(spring.xml)中对service中的方法进行了aop管理,所以在执行 System.out.println(d.getDname());时session并未关闭,因此可以打印信息(此外需说明的是,在执行 Dept d=deptDaoImpl.findById(id);语句时,session并未与数据库交互,执行System.out.println(d.getDname())才向数据库发送相应SQL——这是因为load方法采用延迟加载。

    解决方法:

    若采用load方法,需配置opensessioninview,这样就可以了。

  • 相关阅读:
    线性回归和 逻辑回归 的思考(参考斯坦福 吴恩达的课程)
    数据结构算法基础-内部排序算法
    机器学习《test》
    day1.接口测试(概念、Postman、SoapUI、jmeter)
    SQL2000 3核6核 CUP 安装SP4
    SQL常用语句
    SQL SERVER 2000数据库置疑处理
    常用终端命令
    c++ 位操作
    计算机为什么用补码存储数据?
  • 原文地址:https://www.cnblogs.com/wql025/p/4896244.html
Copyright © 2011-2022 走看看