2010-03-03 4 views
9

Как заставить Hibernate обновлять экземпляр объекта, даже если объект не грязный? Я использую Hibernate 3.3.2 GA, Hibernate Annotations и Hibernate EntityManager кстати. Я действительно хочу, чтобы Hibernate выполнял общий оператор UPDATE, даже если какое-либо свойство в сущности не изменилось.Force update in Hibernate

Мне нужно это, потому что некоторые прослушиватели событий должны быть вызваны для выполнения дополнительной работы, когда приложение запускается в первый раз.

Спасибо!

ответ

10

ok - нашел это сам. Это делает трюк:

Session session = (Session)entityManager.getDelegate(); 
session.evict(entity); 
session.update(entity); 
+0

+1 Я слышал о трюке раньше, но не мог вспомнить. – ewernli

+0

Аккуратный трюк, но я просто попробовал его, и стоит обратить внимание на то, что если вы также заинтересованы в том, чтобы это зафиксировать «entity.childEntity», он не будет - он разбивает дерево зависимостей. –

0

Try em.flush(), который используется для EJB 3.0 сущностей, которые также использует JPA похож на Hibernate 3.2.2 GA. Если он не работает нормально, используйте транзакции в порядке.

+1

Flush force Hibernate синхронизирует изменения в памяти с базой данных. Но если Hibernate не считает объект грязным, он пока ничего не закроет, насколько я помню. – ewernli

+0

yep - flush() IN здесь не помогает, так как никаких изменений не производится – gubrutz

1
session.evict(entity); 
session.update(entity); 

Хороший трюк, но следите за переходными объектами, прежде чем вводить это в какой-либо код автоматизации. Для переходных процессов у меня есть то StaleStateObjectException

3

Для переходных процессов, вы можете проверить

if(session.contains(entity)) { 
    session.evict(entity); 
} 
session.update(entity);