JPA抓取策略:Lazy和Hibernate抓取策略:Lazy的疑问
Hibernate抓取策略Lazy是可以延迟抓取的,即直到应用程序对集合进行了操作,才会去抓取
JPA标注使用抓取策略Lazy时,当我去使用集合时却报session缓存中没有集合数据异常,
没有延迟抓取,应该不是类似hibernate get和Load的问题啊
JPA和Hibernate的抓取策略Lazy到底有何异同?
------解决方案--------------------几乎是一模一样的。
lazy 只能在事务没有完成时处理,一旦事务完成就会出现异常。
像 lazy 这种功能基本上就是鸡肋,没有什么用处。如果确定需要使用的时,请直接使用强制加载。
------解决方案--------------------你需要使用opensessioninviewfilter
在lazy情况下,如果事务关闭了,你再取是会报错误的。
使用(hibernate/jpa)opensessioninviewfilter就不会了
------解决方案--------------------顶4楼
web.xml中配置:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
------解决方案--------------------OpenSessionInViewFilter 是种很鸡肋的东西,把一个事务从请求一直拖到响应整整一个周期,如果并发量较高的话,这个应用立马得挂掉。
人家事务范围越小越好,这个好家伙,将事务延长至整个请求/响应的生命周期。
------解决方案--------------------设置延迟,需要的时候自己强制加载。
------解决方案--------------------关注关注
------解决方案--------------------
之前不明白为什么很多人说OpenSessionInViewFilter不好,虽然我自己也没用。今天总算知道了,谢谢。
------解决方案--------------------对于lazy,我的做法是都设为延迟,然后load分两种,一种是普通的load,没用load延迟属性,还有一种的是load(Class, List lazyProperties),用哪种,加载那些延迟属性在程序中判断。
嘿嘿,虽然回复的内容跟楼主的问题木有关系,但是看到了火龙果的回复之后有点儿激动,楼主见谅。
------解决方案--------------------JPA这东西似乎不容易搞定
------解决方案--------------------即使用了OpenSessionInViewFilter也不一定能解决问题(前提是你真用了JPA的话)
------解决方案--------------------关注中~~~
------解决方案--------------------
特别是你的jsp会花输出很多内容,碰巧客户网速又不快的话,会很悲剧。
不过,如果并非量可以忽略的话,这种偷懒的模式(不需要手工控制session/trasaction)还可以考虑的