Jason ---分享,共同进步

激情成就梦想,努力创造未来
随笔 - 53, 文章 - 1, 评论 - 45, 引用 - 0
数据加载中……

hibernate lazy

今天项目组有要使用的hibernate lazy的,我一直对这种lazy的方式是不赞成使用的,所以我的项目组内是明确不能使lazy,包括true和false当然hibernate 默认的模式是true ,但是在程序中我们是可以控制,当然如果不做配置话,也无法在前端使用,其实在项目中,用到lazy的时候并不是特别多(个人观点),大部分的数据都是明确的要在后台查询出来的。用lazy也并不复杂,在web.xml中配置

Xml代码 复制代码
  1. <filter>  
  2.     <filter-name>hibernateFilter</filter-name>  
  3.     <filter-class>  
  4.         org.springframework.orm.hibernate3.support.OpenSessionInViewFilter   
  5.     </filter-class>  
  6.     <init-param>  
  7.         <param-name>singleSession</param-name>  
  8.         <param-value>false</param-value>  
  9.     </init-param>  
  10. </filter>  
  11.   
  12. <filter-mapping>  
  13.     <filter-name>hibernateFilter</filter-name>  
  14.     <url-pattern>*.do</url-pattern>  
  15. </filter-mapping>  

 

就可以使用延迟加载了,spring通过filter的方式对绑定hibernate session 到request的线程中。

that binds a Hibernate Session to the thread for the entire processing of the request

 

刚开始我是把上面这段配置随便放到web.xml中,一致不成功总报session 关闭,不起作用,最后查了一下,我把这个filter放到了struts的filter之上,就可以了。

 

 

说明FlushMode有五种属性

1 NEVEL  

已经废弃了,被MANUAL取代了


2 MANUAL

spring3.x中的opensessioninviewfilter已经将默认的FlushMode设置为MANUAL了;
如果FlushMode是MANUAL或NEVEL,在操作过程中hibernate会将事务设置为readonly,所以在
增加、删除或修改操作过程中会出现如下错误
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read
-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition;
解决办法网上有很多;
1 配置事务,spring会读取事务中的各种配置来覆盖hibernate的session中的FlushMode;
2 先编程式修改FlushMode,比如session.setFlushMode(FlushMode.AUTO); 这样hibernate就会自动去除readonly限制;
3 直接修改opensessioninviewfilter过滤器的配置,配置过滤器的时候配置
<filter>
      
<filter-name>openSession</filter-name>
      
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
      
<init-param>
          
<param-name>flushMode</param-name>
          
<param-value>AUTO</param-value>
      
</init-param>
  
</filter>

3 AUTO

设置成auto之后,当程序进行查询、提交事务或者调用session.flush()的时候,都会使缓存和数据库进行同步,也就是刷新数据库

4 COMMIT

提交事务或者session.flush()时,刷新数据库;查询不刷新


5 ALWAYS

每次进行查询、提交事务、session.flush()的时候都会刷数据库
这里需要说一下和AUTO的区别,当hibernate缓存中的对象被改动之后,会被标记为脏数据(即与数据库不同步了)。当session设置为FlushMode.AUTO时,hibernate在进行查询的时候会判断缓存中的数据是否为脏数据,是则刷数据库,不是则不刷,而always是直接刷新,不进行任何判断。很显然auto比always要高效得多。

 

posted on 2011-08-12 13:17 agun 阅读(891) 评论(0)  编辑  收藏 所属分类: java web


只有注册用户登录后才能发表评论。


网站导航: