解决Hibernate:could not initialize proxy - no Sessio

    添加时间:2013-5-25 点击量:

                这个从字面上就可以看出:不克不及初始化,没有session。也就说首要原因是因为session封闭了。


            在Hibernate中,<many-to-one.../>中的lazy默认为proxy。如许hibernate在数据库中查询数据时事不会把接洽关系的


    对象查出来的,而是保存一个获得该值得办法:getXxxx()。须要应用这个值的时辰,也就是应用getXxx()办法来


    用的时辰,Hibernate就会哄骗这个办法从数据库中获取响应的数据。然则很不幸,我们的session早就封闭了。这


    是因为Hibernate的懒加载策略,在Hibernate中是应用sessionFactory来经管session,我们每进行一次数据库操纵时


    都邑新建一个session对象,操纵完成后,hibernate就会在dao层立即封闭该session。如许做就可以严格把握


    session,避免呈现初级错误。


     


           对于这种错误,一般都邑有三个办法可以解决。


           1把lazy设成false。这个是最简单的办法,小我认为也是斗劲笨的办法。因为这是在用效力作为价格。


           2应用OpenSessionInViewFilter。这种办法是将session交给servlet filter来经管,每当一个恳求来之后就会开


    启一个session,只有当响应停止后才会关闭。如下:



    1         <filter-name>hibernateFilter</filter-name> 
    
    2 <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>
    3 </filter
    4 <filter-mapping>
    5 <filter-name>hibernateFilter</filter-name>
    6 <url-pattern>/</url-pattern>
    7 </filter-mapping>



     


           上方的设备文件时在web.xml中设备的。


     


           3将hibernate的抓起策略改为join。也就是是left join fetch或inner join fetch语法。就是在<many-to-one../>中配


    置lazy=false fetch=join即可。如:



    1     <many-to-one name=worker lazy=false fetch=join class=com.paixie.domain.Worker>
    
    2
    3 <column name=positionId></column>
    4
    5 </many-to-one>



     


     

    读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。
    分享到: