Если у меня есть экземпляр объекта персистентности, и я устанавливаю некоторые члены следующим образом:

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

Действительно ли это приведет к тому, что спящий режим выдаст команду обновления SQL для обновления записи? Или спящий режим достаточно умен, чтобы знать, что объект был обновлен, но значения на самом деле не изменились?

1
Nik Reiman 20 Май 2009 в 17:05
Вы используете здесь чистый Hibernate или Hibernate с JPA?
 – 
James McMahon
20 Май 2009 в 17:21

3 ответа

Лучший ответ

В общем, он не должен выдавать обновление, если значения свойств сравниваются одинаково. (В частности, сравните равные в соответствии с их реализацией типа --- которая обычно совпадает с их методом 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) ... если вы не используете сеанс без сохранения состояния?)

2
araqnid 20 Май 2009 в 17:25

Я считаю, что он будет достаточно умен, чтобы распознать, что объект не был изменен, и таким образом избежать обновления.

Чтобы узнать наверняка, нужно включить вывод SQL для Hibernate. Добавлять

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

В раздел фабрики сеансов конфигурации hibernate в вашем hibernate.cfg.xml.

1
James McMahon 20 Май 2009 в 17:12

AFAIK, он не будет выполнять команду SQL.

0
Frederik Gheysels 20 Май 2009 в 17:16