【发布时间】:2012-04-17 14:27:06
【问题描述】:
我在 JSF 项目后面使用 Hibernate。
在主页中,我有一个表示对象列表的数据表。
我使用 Hibernate 成功更新了对象的属性(在数据表中找到)。更新后,通过使用“xxx?faces-redirect=true”重定向来刷新页面。我重定向页面以避免“重复提交表单”类问题。
然后,如果我按 F5 几次,更新对象的旧属性值可能会返回到页面。
据我了解,这是一个休眠会话问题。因为如果我在使用后立即关闭每个会话,则不会发生此问题。但是,由于延迟获取策略,我无法在交易后关闭会话。
简而言之,休眠可能会带来对象的旧值,尽管它已成功更新。我怎样才能避免这样的问题?
ps:我怀疑 Hibernate 的缓存机制,我禁用了一级和二级缓存:
<property name="hibernate.cache.use_query_cache">false</property>
<property name="hibernate.use_second_level_cache">false</property>
但它也没有用..
更新:在@Johanna 回复后,我控制了会话实例的 id,并指出我的 HibernateUtil 类在大多数情况下返回不同的会话或打开一个新会话。下面是 getSession() 方法:
public static Session getSession(){
Session se = HibernateUtil.session.get();
if(se == null)
{
se = sessionFactory.openSession();
HibernateUtil.session.set(se);
}
return se;
}
我假设一旦我有一个会话,我就会在该会话中进行所有内容,例如列表、更新等。因为我在 getSession() 方法中进行了必要的控制。我在哪里犯错了?
【问题讨论】:
标签: hibernate jsf caching page-refresh