【问题标题】:Hibernate - Same result after update/select休眠 - 更新/选择后相同的结果
【发布时间】:2010-10-27 16:20:31
【问题描述】:

hibernateSession.createQuery("select foo where id = 1");
// 此命令返回 id 为 1 的项目。

// [BREAK POINT STOP] ==> 我进入 MySQL 并手动删除此项目。
// [断点继续]

hibernateSession.createQuery("select foo where id = 1");
// 此命令也返回 id 为 1 的项目! :-(

hibernateSession.flush()/hibernateSession.clean()也是一样
我认为我没有很好地使用我的休眠缓存...

【问题讨论】:

    标签: java hibernate select jpa caching


    【解决方案1】:

    绝对是缓存问题。您使用的是同一个会话吗?尝试关闭会话并从工厂获取一个新会话。

    【讨论】:

      【解决方案2】:

      第一个查询将该对象加载到休眠会话中。 您删除数据库中的行没有影响,因为您使用的是同一个会话。

      您需要启动一个新会话或evict 会话中的对象。

      【讨论】:

        【解决方案3】:

        试试这个

        Object o = hibernateSession.createQuery("select foo where id = 1").uniqueResult();
        
        // [BREAK POINT STOP] ==> I go in MySQL and I delete this item manualy.
        
        hibernateSession.evict(o);
        hibernateSession.createQuery("select foo where id = 1");
        

        如果可行,那么您的问题在于 L1 缓存。 L1 缓存始终存在,与给定的 Session 对象相关联,并且独立于 L2 缓存,这是所有休眠缓存文档所讨论的内容。 L1 缓存的目的是满足如果在同一个会话中两次获取同一个数据库对象,那么这两个引用将满足 r1 == r2 的要求。

        基本上,当可以同时修改数据库时使用休眠并不简单。

        【讨论】:

          猜你喜欢
          • 2013-04-24
          • 2016-10-21
          • 2015-10-13
          • 2018-06-03
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 2016-04-08
          相关资源
          最近更新 更多