Hibernate - 更新/选择后的结果相同

时间:2009-05-20 15:29:28

标签: java hibernate select jpa caching

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缓存......

3 个答案:

答案 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并不简单。