我在显示数据库中的数据时遇到问题。如果更新对象,有时会得到旧数据,有时会得到新数据。更新功能运行良好(我可以在数据库中看到正确的更新),而读取功能似乎可以获取缓存的数据。我试图禁用两个缓存,尝试在更新/保存期间打开和关闭会话,但仍然无法正常工作。用户bean和商店bean都具有懒惰访存。谢谢!
读取功能:
public static List<Store> getStoreByUser(User user) throws HibernateException { List<Store> result = null; Session session = sessionFactory.getCurrentSession(); Transaction transaction = null; try { transaction = session.getTransaction(); Criteria criteria = session.createCriteria(Store.class); criteria.add(Restrictions.eq("userUserID", user)); result = criteria.list(); } catch (HibernateException he) { logger.error("No Store found for user: = " + user, he); throw he; } return result; }
更新/保存功能:
public static Integer insertOrUpdateStore(Store store) throws HibernateException { Integer id = null; Session session = sessionFactory.getCurrentSession(); Transaction transaction = null; try { transaction = session.getTransaction(); if (store.getStoreID() != null && store.getStoreID() != 0) { session.merge(store); transaction.commit(); } else { id = (Integer) session.save(store); transaction.commit(); } } catch (HibernateException he) { if (transaction != null) { transaction.rollback(); } } finally { } return id; }
通常,您具有隔离级别 “已读读”。这使您的事务可以查看其他事务已提交的更改。隔离级别由基础dbms实现,而不是由hibernate模式实现。
您不能禁用第一级缓存(可能通过使用无状态会话,不应将其用于一般用途)。执行查询时,NH总是从缓存中返回值,以确保在内存中不会一次获得相同的数据库记录。
如果这是您的问题,则应切换到更高的隔离级别。例如可重复读取(这意味着它的意思:多次读取相同的数据时,您总是会得到相同的结果)。仍然有机会看到其他交易的变化。使用隔离级别可序列化的隔离,您不再应该遇到这种问题。
注意:切换到另一个隔离级别是大多数系统的重大更改,应仔细计划。