当已设置持久性实例但未更改时,hibernate是否会更新数据库?

时间:2009-05-20 13:05:34

标签: hibernate

如果我有一个持久性对象的实例,我会像这样设置一些成员:

MyThing thing = session.get(MyThing.class, id);
thing.setSomething(thing.getSomething());
session.update(thing);

这实际上是否会导致hibernate发出SQL更新命令来刷新记录?或者hibernate足够聪明,知道对象已更新,但值实际上没有改变?

3 个答案:

答案 0 :(得分:2)

通常,如果属性值比较相等,则不应发出更新。 (具体来说,根据它们的Type实现进行比较 - 通常与它们的equals(Object)方法相同)。

nemo是对的,你应该始终了解SQL Hibernate正在执行什么。虽然我建议将'org.hibernate.SQL'记录器('net.sf.hibernate.SQL'用于Hibernate 2)设置为DEBUG级别(在log4j中),而不是使用“show_sql”属性(总是写入System.out)或System.err iirc)。

(虽然我认为你的意思是session.flush(),而不是session.update(thing) ......除非你使用的是无状态会话?)

答案 1 :(得分:1)

我相信它会足够聪明地认识到对象没有被更改,从而避免了更新。

确定方法是打开Hibernate的SQL输出。添加

<property name="hibernate.show_sql">true</property>

到hibernate-configuration的session-factory部分,在你的hibernate.cfg.xml中。

答案 2 :(得分:0)

AFAIK,它不会执行SQL命令。