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方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 士兵杀敌(二)(线段树+树状数组)
- 下一篇: nagios报警延迟的解决--flapp