本人对于hibernate基础的概念不是很懂,公司系统用到了hibernate。
有个小问题要问一下各位:
   我昨天在写程序时,出现了以下错误:2009-06-06 15:48:40,609 ERROR LazyInitializationException - <could not initialize proxy - the owning Session was closed>
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:60)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
是这样的,有两个表,分别为a表和b表,在a表的hbm.xml文件中,引用到了一个<many-to-one>的对象,这个对象就是b表,但是我查的这个表用的是getHibernateTemplate().get(a.class,id),这个返回的对象值中所有属性都正常,只有b这个对象返回的是代理类,这个问题只要在a.hbm.xml文件中,对b表的引用加上lazy="false"就可以。
但是现在我对于这种概念有点模糊,为什么引用其他表时,会出现这种问题,在网上查了一下,不是调用load方法是才会涉及到lazy错误么,是不是lazy="true"时,对于所有的方法,只取得对象的id。那默认的什么都不写,就是lazy="true"么,对于自己的问题有些疑惑,想在这里确认一下。谢谢

解决方案 »

  1.   

    1.lazy默认是打开的
    2.异常信息the owning Session was closed表明session已经关闭了,其中也是涉及到lazy问题,因为你是先关闭session再返回的数据,返回数据的时候,如果lazy=true,就会出现这种异常。解决方法有3种:1种是在return之前使用一下其中的属性,第二种是关闭lazy。最后一种就是用web.xml里面配置延迟加载的过滤器
      

  2.   

    默认情况是lazy="false",是立即加载,lazy="true"是延迟加载,如果你不访问它的其他属性或方法,hibernate不会执行sql,当你真正访问它的时候才会执行sql