【问题标题】: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 的要求。
基本上,当可以同时修改数据库时使用休眠并不简单。