欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

hibernateTemplate的load方法

发布时间:2025/5/22 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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());出现此异常。

@Testpublic void getDeptById(){//load//errorDept 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,这样就可以了。

 

转载于:https://www.cnblogs.com/wql025/p/4896244.html

总结

以上是生活随笔为你收集整理的hibernateTemplate的load方法的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。