一直很苦恼怎么比较有效解决hibernate的lazy问题..假如有个User和Clazz的Entity 当我用hibernate获取到Clazz的时候View的这一部分会拿Clazz里面所有的属性,里面包括User,跟着就会给我报lazy这个异常出来。但我并不需要获取User这个属性...怎么解决这个问题..不要跟我说用opensessioninview,我觉得这个是一个很糟糕的做法.. 求各路英雄搭救啊。。spring mvchibernatelazy
解决方案 »
- 实现不同服务器上的文件上传(ftp)
- 关于一个年份日期的错误500 Servlet Exception java.lang.NumberFormatException: For input string:"9-"
- 如何获取Struts2上传文件大小
- 文本框不可按
- Error in /cgi-win/itemview.dll,这个是什么错误啊?不懂了。
- tomcat日志:
- WAP,IVR技术群....欢迎各位朋友.......
- 兄弟们不帮我死定了,解决了马上给分!!!拜托拜托拜托!!!
- jsp里面有没有直接操作数据库的web程序?
- jsp中的return返回到哪里
- 浏览器后退按钮没有跳上一页,而是跳了上一个功能的页面,这是什么原因引起的?怎么解决?
- 关于struts2 一个action多个submit按钮的问题
但是你的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关闭有哪几种方式
要么eager要么opensessioninview
比如说
User
int id
List<Book> books
你把books这个设置懒加载
要用到它时hql:from User u left outer join fetch u.books这就可以了
如果要把结果序列化成json格式的话,在service层把u.setBooks(null)不是要报懒加载异常的
如果非要默认不懒 用fetch
设置为空是为了序列话json格式暴异常,如果你要在view层调用books这个属性只有现在dao层fetch他。不然要出错的
(1)Hibernate.initialize(XX.getYYYY());强制加载,哪个属性要拿到session外面就强制加载哪个
(2)join fetch 出现fetch自动屏蔽lazy,建议第一种
报的错是org.hibernate.HibernateException: collection is not associated with any session
但你这种办法可以避免fetch..但这样就产生多条select语句 为什么还要建议用它呢