hibernateSession.createQuery(“select foo where id = 1”);
//此命令返回ID为1的项目
// [BREAK POINT STOP] ==>我进入MySQL并且我删除了这个项目manualy
// [BREAK POINT CONTINU]
hibernateSession.createQuery(“select foo where id = 1”);
//此命令也返回ID为1的Item! :-(
它与hibernateSession.flush()/ hibernateSession.clean()相同
我想我不习惯使用我的hibernate缓存......
答案 0 :(得分:3)
第一个查询将该对象加载到hibernate会话中。 删除数据库中的行没有任何影响,因为您使用的是同一个会话。
您需要从会话中开始新会话或evict对象。
答案 1 :(得分:1)
绝对是一个缓存问题。你在使用同一个会话吗?尝试关闭会话并从工厂获取新会话。
答案 2 :(得分:1)
试试这个
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缓存,这是所有hibernate缓存文档所讨论的内容。 L1缓存的目的是满足以下要求:如果在同一会话中两次获得相同的数据库对象,则两个引用将满足r1 == r2。
基本上,当可以对DB进行并发修改时使用hibernate并不简单。