日期:2014-05-17  浏览次数:20688 次

hibernate lazy 在spring MVC 或者 Stuts2
一直很苦恼怎么比较有效解决hibernate的lazy问题..假如有个User和Clazz的Entity 当我用hibernate获取到Clazz的时候View的这一部分会拿Clazz里面所有的属性,里面包括User,跟着就会给我报lazy这个异常出来。但我并不需要获取User这个属性...怎么解决这个问题..不要跟我说用opensessioninview,我觉得这个是一个很糟糕的做法.. 求各路英雄搭救啊。。
spring?mvc hibernate lazy

------解决方案--------------------
是你在离开 service 层去往view层的时候,session被你手动的关闭掉了。
但是你的clazz.hibernate.xml配置文件中,User映射的配置是 延迟加载(懒加载),
所以你在获取clazz的时候并没有加载user这个属性。

然而你在view那个层绝对间接或直接的调用了user这个属性,这时候session已经关闭,由于clazz是一个hibernte的代理对象,所以在调用其属性时候,会先判断与数据库的session绑定(与数据库是否有会话),然而session被你关闭,所以通向数据库的链接被你关闭,你就无法取到数据库中user这个属性了,就出现了懒加载异常,实际上是因为没有与数据库获得会话,导致懒加载未能实现。

建议在clazz.hibernate.xml中把user这个属性强制加载,如果用不到user这个属性,那么在view层避免调用。
如果需要user,又不想用opensessioninview 那就在service层把所有要求的数据获得,封装成VO,在view层调用VO,不过比较麻烦。

建议你百度 hibernate的session关闭有哪几种方式

------解决方案--------------------
这个不好弄,我都是像你说的用opensessioninview ,或直接禁用lazy加载。。。至今我也没发现好的办法。。。
------解决方案--------------------
hibernate一直没有用。opensessiononinview是可以解决的,目前还不知道有什么其它好点的办法。
------解决方案--------------------
建议你百度 hibernate的session关闭有哪几种方式
------解决方案--------------------
真没纠结过其它方法。
要么eager要么opensessioninview 
------解决方案--------------------
直接强制抓取,在hql语句中用fetch关键字