Hibernate与Spring结合的时候...非web程序...懒加载...

titua2 2010-01-21 10:07:32
问个问题...在使用Hibernate与Spring结合的时候,Hibernate在处理对象之间的关系为双向关联,懒加载...在web项目中可以使用web.xml的配置,加入一个Filter<<OpenSessionInViewFilter>>解决session close! 但是非web程序,就是普通的应用程序,如何解决懒加载 no session or session was closed !

如果说是将懒加载去掉...那不是我想要知道的答案...我就想要知道懒加载下的解决方案 ...

着急...
...全文
135 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
titua2 2010-01-21
  • 打赏
  • 举报
回复
额.ls有朋友说OpenSessionInterceptor可以解决.但我在看源码的时候,发现居然有WebRequest属性,难道必须在web项目才行?

如果非web项目也行,麻烦大虾给下源码...

我现在考虑是否使用AOP拦截技术,使用@AfterThrowing(异常拦截) 当操作出现org.hibernate.LazyInitializationException异常的时候,拦截,创建新的session并传递给具体的被拦截方法..然后调用执行...
Johnson_Hong 2010-01-21
  • 打赏
  • 举报
回复
你可以在你需要保持完整事务的那个层次做声明式事务的配置就ok了,不过在这个层次的上层是不能访问延迟加载属性的,所以你要先把你想访问的属性都初始化好
magi803 2010-01-21
  • 打赏
  • 举报
回复
还有,layze=true千万不要去掉,否则性能会让你无法接受
magi803 2010-01-21
  • 打赏
  • 举报
回复
用hibernate必须掌握对象3状态1会话,否则会遇到无穷无尽的麻烦。
spring和hibernate绑定,用于web,默认的方式是发出一个请求就打开会话,请求完毕后就关闭会话。如果用layze=true,你很有可能是在WEB请求完毕后在进行后续的级联操作,就会发生你那样的错误。

解决思路是:发出请求的,先关闭上一次的会话,请求回来后,不关闭会话。也就是说,你可以重新写一个filter,在filter中关闭一次会话。

这是我长期用hibernate的经验,希望对你有帮助。
whereusejava 2010-01-21
  • 打赏
  • 举报
回复
不是web项目“懒加载”可以用其他的方式实现相同的功能!
Johnson_Hong 2010-01-21
  • 打赏
  • 举报
回复
OpenSessionInterceptor可以实现这个功能

不过这2个都不用也可以,一般大的项目中,很少会延迟到view层才加载,一般都是在service层统一配置事务,service方法里是同一个session,方法结束后事务提交,session关闭。
临远 2010-01-21
  • 打赏
  • 举报
回复
可以使用OpenSessionInterceptor,
fyjava1984 2010-01-21
  • 打赏
  • 举报
回复
顶一下

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧