2010-03-03 15 views
9

Come posso forzare Hibernate per aggiornare un'istanza entità, anche se l'entità è non sporco? Sto usando Hibernate 3.3.2 GA, Hibernate Annotations e Hibernate EntityManager btw. Voglio davvero che Hibernate esegua l'istruzione UPDATE generica anche se non è stata modificata nessuna proprietà sull'entità.Forza aggiornamento in Hibernate

ho bisogno di questo perché alcuni ascoltatori di eventi hanno bisogno di ottenere invocato per fare qualche lavoro supplementare quando l'applicazione viene eseguita per la prima volta.

Grazie!

risposta

10

ok, l'ho trovato anch'io. Questo fa il trucco:

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

+1 avevo sentito parlare il trucco prima, ma non riuscivo a richiamarlo. – ewernli

+0

Trucchetto accurato ma l'ho appena provato e vale la pena sottolineare che se anche tu sei interessato ad avere questo commit "entity.childEntity" non lo farà - si romperà l'albero delle dipendenze. –

0

Try em.flush() che viene utilizzato per EJB 3.0 entità, che utilizza anche APP simili a Hibernate 3.2.2 GA. Se non funziona normalmente, usa flush nelle transazioni.

+1

Flush forces Hibernate per sincronizzare le modifiche in memoria con il database. Ma se Hibernate non considera l'entità come sporca, non farà svuotare nulla fino a quel momento che ricordo. – ewernli

+0

sì - flush() ing non aiuta qui perché non vengono apportate modifiche – gubrutz

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

Buon trucco, ma attenzione agli oggetti transitori prima di inserire questo in un codice di automazione. Per transitori Ho poi StaleStateObjectException

3

Per transitori, è possibile controllare

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