hibernate 的 二级缓存 和 OpenSessionInViewFilter

有javaeye上的一篇文章http://www.iteye.com/topic/18904,写的真是不错,学到了很多的东西。
在使用的时候,我在web.xml中配置了OpenSessionInViewFilter,并且启动了二级缓存,但是,在方便的同时,还真的发现了很多的问题
1.我有一个Column类,其下有一个news集合,是一个一对多的关系,在Column端对news集合设置了reverse=true,用ecache配置了
<cache name="com.qinglin.model.Column.news"
maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200"
timeToIdleSeconds="3600" overflowToDisk="true" />


这样在新建一个news,并且setColumn(Column c)后,前台还真是没有及时的更新,引用上面仁兄的话,一个collection缓存仅在这个collection里面的元素有增删时才失效。而我在Column端对news集合设置了reverse=true,当然不会自动更新二级缓存中的集合news了,没办法,手动this.getSessionFactory().evictCollection("com.qinglin.model.Column.news",news.getCol_id()); ,清除集合news缓存。
2.仍旧是上面的一个例子,在news.xml中对日期这个属性
<property name="add_date" type="java.util.Date" update="false">
<column name="add_date" length="19">
<comment>添加日期</comment>
</column>
</property>
这样,也在更新新闻这个类时出问题了,由于我在web.xml中设着了OpenSessionInViewFilter,且想更新完新闻后,接着显示出这条新闻,结果发现,session中竟然没有日期这一行,想了想,在edit(news)方法中加上了
news = (News)this.getHibernateTemplate().merge(news);
this.getSession().flush();
this.getSession().refresh(news);
这三句,第一句的得到的持久化对对象news没有add_date属性,第二句是为了向数据库中发送update的sql语句,更新数据库,由于设置了update=false,则数据库中的add_date不会失效,另外第三条语句是为了再从数据库中取出这个具有add_date属性的新闻,更新session缓存,为了在到达前台时能够正常的显示日期。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值