如果我有一個持久性對象的實例,我在設置一些成員,像這樣:當一個持久化實例被設置但沒有改變時,hibernate會更新數據庫嗎?
MyThing thing = session.get(MyThing.class, id);
thing.setSomething(thing.getSomething());
session.update(thing);
這是否會真正使冬眠發出SQL更新命令刷新紀錄?或者hibernate足夠聰明,知道該對象已更新,但這些值實際上並沒有改變?
如果我有一個持久性對象的實例,我在設置一些成員,像這樣:當一個持久化實例被設置但沒有改變時,hibernate會更新數據庫嗎?
MyThing thing = session.get(MyThing.class, id);
thing.setSomething(thing.getSomething());
session.update(thing);
這是否會真正使冬眠發出SQL更新命令刷新紀錄?或者hibernate足夠聰明,知道該對象已更新,但這些值實際上並沒有改變?
通常,如果屬性值比較相等,則不應發出更新。 (具體來說,根據它們的類型實現 - 通常與它們的equals(Object)方法相同)比較相等。
nemo是對的,你應該始終知道SQL Hibernate正在執行什麼。儘管我建議將'org.hibernate.SQL'記錄器(Hibernate 2的'net.sf.hibernate.SQL')設置爲DEBUG級別(在log4j中),而不是使用「show_sql」屬性(它始終寫入System.out或System.err iirc)。
我相信它會足夠聰明地認識到對象沒有被改變,從而避免了更新。
確定的方法是打開Hibernate的SQL輸出。添加
<property name="hibernate.show_sql">true</property>
在hibernate.cfg.xml中的會話工廠部分的hibernate配置。
AFAIK,它不會執行SQL命令。
是否使用純休眠這裏或JPA休眠(雖然我認爲你的意思
session.flush()
,不session.update(thing)
......除非你使用的是無狀態會話?)? – 2009-05-20 13:21:23