小编典典

Hibernate读取功能可显示旧数据

hibernate

我在显示数据库中的数据时遇到问题。如果更新对象,有时会得到旧数据,有时会得到新数据。更新功能运行良好(我可以在数据库中看到正确的更新),而读取功能似乎可以获取缓存的数据。我试图禁用两个缓存,尝试在更新/保存期间打开和关闭会话,但仍然无法正常工作。用户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;
}

阅读 322

收藏
2020-06-20

共1个答案

小编典典

通常,您具有隔离级别
“已读读”。这使您的事务可以查看其他事务已提交的更改。隔离级别由基础dbms实现,而不是由hibernate模式实现。

您不能禁用第一级缓存(可能通过使用无状态会话,不应将其用于一般用途)。执行查询时,NH总是从缓存中返回值,以确保在内存中不会一次获得相同的数据库记录。

如果这是您的问题,则应切换到更高的隔离级别。例如可重复读取(这意味着它的意思:多次读取相同的数据时,您总是会得到相同的结果)。仍然有机会看到其他交易的变化。使用隔离级别可序列化的隔离,您不再应该遇到这种问题。

注意:切换到另一个隔离级别是大多数系统的重大更改,应仔细计划。

2020-06-20