hibernateTemplate的load方法
hibernateTemplate的load方法采用延遲加載,所以應(yīng)當(dāng)注意。
如果配置不當(dāng),采用此方法獲取對(duì)象,往往會(huì)出現(xiàn)異常:
javax.servlet.ServletException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
出現(xiàn)此異常一般是因?yàn)閟ession已關(guān)閉,無(wú)法獲取對(duì)象。
測(cè)試代碼:
以下是部門(mén)的實(shí)現(xiàn)類DeptDaoImpl的一個(gè)方法——通過(guò)部門(mén)id獲取指定部門(mén)
public Dept findById(int did) {return hibernateTemplate.load(Dept.class, did);}以下是DeptService中相應(yīng)的方法
public Dept findById(int id){return deptDaoImpl.findById(id);}測(cè)試類測(cè)試此方法,出現(xiàn)異常:javax.servlet.ServletException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
分析:為什么此處會(huì)出現(xiàn)異常呢?這是因?yàn)閳?zhí)行Dept d= deptService.findById(156);這一句后session已關(guān)閉,且因?yàn)樵?span style="color:#000000;font-size:15px;">DeptDaoImpl采用的load的方法——延遲加載,它并不會(huì)從數(shù)據(jù)庫(kù)中加載id為156的這個(gè)部門(mén),因此執(zhí)行System.out.println(d.getDname());出現(xiàn)此異常。
@Testpublic void getDeptById(){//load//errorDept d= deptService.findById(156);System.out.println(d.getDname());}下面將 System.out.println(d.getDname());這句代碼放在DeptService進(jìn)行測(cè)試
public void test(int id){Dept d=deptDaoImpl.findById(id);System.out.println(d.getDname());}成功,打印信息:
| 技術(shù)部 |
?
分析:為什么能在DeptService能夠獲得指定部門(mén)的部門(mén)名稱呢?
——這是因?yàn)樵趕pring的配置文件中(spring.xml)中對(duì)service中的方法進(jìn)行了aop管理,所以在執(zhí)行 System.out.println(d.getDname());時(shí)session并未關(guān)閉,因此可以打印信息(此外需說(shuō)明的是,在執(zhí)行 Dept d=deptDaoImpl.findById(id);語(yǔ)句時(shí),session并未與數(shù)據(jù)庫(kù)交互,執(zhí)行System.out.println(d.getDname())才向數(shù)據(jù)庫(kù)發(fā)送相應(yīng)SQL——這是因?yàn)閘oad方法采用延遲加載。)
解決方法:
若采用load方法,需配置opensessioninview,這樣就可以了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wql025/p/4896244.html
總結(jié)
以上是生活随笔為你收集整理的hibernateTemplate的load方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 士兵杀敌(二)(线段树+树状数组)
- 下一篇: nagios报警延迟的解决--flapp