【发布时间】:2010-05-27 14:20:04
【问题描述】:
我刚刚开始使用休眠。有点迷茫。
我只是想看看一级缓存的操作,我理解是批量查询直到会话结束。
但是如果我创建了一个对象,hibernate 会立即保存它,这样当我以后在同一个事务中更新它时,它也必须进行更新:
Session session = factory.getCurrentSession();
session.beginTransaction();
Test1 test1 = new Test1();
test1.setName("Test 1");
test1.setValue(10);
// Touch it
session.save(test1);
System.out.println("At checkpoint 1");
test1.setValue(20);
session.getTransaction().commit();
我看到了保存的 sql,然后是“在检查点 1”,然后是更新的 sql。是我设置错误还是我误解了hibernate的一级缓存?一级缓存是否有好的文档 - 我在休眠文档中没有找到任何内容,但我很容易错过它..
谢谢!
【问题讨论】:
-
啊——太好了!谢谢 - 这解决了为什么它立即保存它的问题。我将其从生成并自己提供了 id 进行了更改,现在两个 sql 语句都在最后执行。如果我提供 id,为什么会有两个 sql 语句,我仍然有点困惑。我原以为休眠可以使用对象中的当前值而不是原始值来运行插入。那么就不需要进行插入和更新。但也许这要求很多?是否有关于 hibernate 在这些情况下做什么和不做什么的文档,或者我应该只看代码吗?
-
也许他们担心您的数据库包含一个触发器,该触发器在插入时执行某些操作,而在更新时执行其他操作。在那种情况下,行为会通过缓存更新来改变吗?
-
感谢 Cobusve - 很可能就是这样。尽管我还看到对同一个对象进行多次更新(记得在每次更新之间调用 SaveOrUpdate),但只有对象的最终状态会更新到数据库中——这意味着任何中间触发器——例如更新历史表所做的更新 - 不会被解雇,所以也许他们并不担心触发器;-)
标签: hibernate