如果我有一个持久性对象的实例,我会像这样设置一些成员:
MyThing thing = session.get(MyThing.class, id);
thing.setSomething(thing.getSomething());
session.update(thing);
这实际上是否会导致hibernate发出SQL更新命令来刷新记录?或者hibernate足够聪明,知道对象已更新,但值实际上没有改变?
答案 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命令。