Hibernate没有反映变化

时间:2009-03-22 23:53:09

标签: java hibernate java-ee struts

我有一个使用Hibernate访问MYSQL数据库的struts应用程序。我有许多页面可以更改数据库。这些更改很精细,数据在DB中更新。但是,当浏览到应该显示此更新信息的页面时,它通常不在那里,即使在几页刷新之后它仍然不存在。最终它会出现。我假设这与hibernate缓存数据有关,但我怎样才能确保数据是最新的?我曾经假设,当它全部通过休眠会话时它会接受更改吗? 我用来进行更新的代码是:

    hSession = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction tx = hSession.getTransaction();
    tx.begin();
    hSession.update(user) ;

然后再次拉出该用户:

org.hibernate.Session hSession = HibernateUtil.getSessionFactory()
.getCurrentSession();
 Transaction tx = hSession.beginTransaction();
 User u= (User) hSession.load(User.class, userID);

2 个答案:

答案 0 :(得分:3)

太少的信息无法真正给出答案。但有些要点检查:

  • 您正在使用交易。你准备好了吗?也许在某些时候你的代码看不到变化,因为尚未提交(或者因为阅读代码在另一个使用先前状态的事务中)。

  • 缓存也可能是个问题。要检查,您可以在每次更改DB(Session.flush())后显式刷新缓存。这可能会降低性能,但可能会帮助您缩小问题范围。

答案 1 :(得分:1)

这可能是second level (session factory) hibernate cache的结果。

缓存应该是透明的,并且可以使用您提供的代码正常工作,但通常在以下情况下会出现问题:

  1. 您正在运行一组计算机,并且没有办法让缓存无法相互配置
  2. 您正在更新hibernate之外的数据库。
  3. 确定它是否是二级缓存问题的最简单方法是完全禁用hibernate配置中的缓存。如果它是缓存,您可以配置群集以了解彼此,以便他们可以自动管理缓存,或者如果外部休眠更新出现问题,您可以使用hibernate api手动使缓存项无效