`

could not load an entity

阅读更多
1.could not load an entity  (get)
2.23:31:32,468 ERROR LazyInitializationException:19 - could not initialize proxy - the owning Session was closed
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed  (load)

Lazy问题可以通过加opensessioninviewfilter解决
在web.xml中加上
<filter>
<filter-name>openSessionInViewFilter </filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter </filter-name>
<url-pattern>*.do </url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>openSessionInViewFilter </filter-name>
<url-pattern>*.jsp </url-pattern>
</filter-mapping>

经过调试是 LAZY的问题.
我的解决办法是:
<many-to-one>里面的属性lazy="false"

<set>里面的属性lazy="true"
<one-to-many>
</set>

有不对的地方,请大家补充

其次关于load取数据出现问题是因为取数据的表有级联关系,在我们分析此问题之前,我们先要明白hibernate中什么是load,什么是get,它们两者之间有什么区别呢??
只要你在以往的开发过程中稍加注意,不难发现,假如有两张表,他们为一对多关系,现在开始查询,如果使用get,那么查询的结果将会是把2张表的数据全部持久化到内存中(如果关系比较深你还打算用它吗?),如果是采用load的方式,那么将只会是把其中一张表(A表)的数据加载到内存中,而另一张表(B表)只存在一个标识,原则上是等页面显示时,如果只要显示A表数据,那么程序直接内存中找A表数据,如果还要显示B表数据,那么就要通过内存中B表的标识重新查找数据库,此时,问题出来了,假如你在DAO中,session.load之后你结束了session的生命周期,那么在页面要显示B表数据,而B表在内存中只是一个标识啊,你的session又处于关闭状态,它无法找啊,这就会出现上面你遇到的那个问题,因此,假如我们不关闭session,页面可以正常显示2张表的数据了,但是问题又来了,如果不关闭session,那么对象将一直以持久态的形式保存在内存中,留下的隐患难以想象(比如该对象容易数据混乱等等),千万不要说session.clear之内的东西也可以把对象变游离态之内的话啊,如果你彻底用session.clear取代session.close的话,嘿嘿,自己去尝试吧,当问题显现出来的时候痛苦吧^_^!好了,我还是说下解决方法吧~最好的方法就是将DAO中的session与事物全部抽取出来做成一个hibernate过滤器,这样既能解决你上面的问题,又能大大减少DAO中的代码...好处很多的哦,使用一次之后就容易上瘾
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics