我有一个使用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);
答案 0 :(得分:3)
太少的信息无法真正给出答案。但有些要点检查:
您正在使用交易。你准备好了吗?也许在某些时候你的代码看不到变化,因为尚未提交(或者因为阅读代码在另一个使用先前状态的事务中)。
缓存也可能是个问题。要检查,您可以在每次更改DB(Session.flush())后显式刷新缓存。这可能会降低性能,但可能会帮助您缩小问题范围。
答案 1 :(得分:1)
这可能是second level (session factory) hibernate cache的结果。
缓存应该是透明的,并且可以使用您提供的代码正常工作,但通常在以下情况下会出现问题:
确定它是否是二级缓存问题的最简单方法是完全禁用hibernate配置中的缓存。如果它是缓存,您可以配置群集以了解彼此,以便他们可以自动管理缓存,或者如果外部休眠更新出现问题,您可以使用hibernate api手动使缓存项无效