2010-03-03 18 views
9

Wie kann ich Hibernate erzwingen, eine Entitätsinstanz zu aktualisieren, selbst wenn die Entität nicht nicht schmutzig ist? Ich benutze Hibernate 3.3.2 GA, Hibernate Annotations und Hibernate EntityManager btw. Ich möchte wirklich, dass Hibernate die generische UPDATE-Anweisung ausführt, auch wenn keine Eigenschaft der Entität geändert wurde.Aktualisierung erzwingen in Hibernate

Ich brauche dies, weil einige Ereignis-Listener aufgerufen werden müssen, um einige zusätzliche Arbeit zu erledigen, wenn die Anwendung zum ersten Mal ausgeführt wird.

Danke!

Antwort

10

ok - habe es selbst gefunden. Dies funktioniert der Trick:

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

+1 ich über den Trick zuvor gehört hatte, konnte es aber nicht mehr. – ewernli

+0

Ordentlicher Trick, aber ich habe es gerade ausprobiert und es lohnt sich, darauf hinzuweisen, dass wenn Sie auch daran interessiert sind, dieses commit "entity.childEntity" zu haben, wird es nicht den Abhängigkeitsbaum durchbrechen. –

0

Try em.flush(), die für EJB 3.0 Einheiten verwendet wird, die auch verwendet JPA ähnliche 3.2.2 GA Hibernate. Wenn es nicht normal funktioniert, verwenden Sie Flush in Transaktionen.

+1

Flush forciert Hibernate, um die Änderungen im Arbeitsspeicher mit der Datenbank zu synchronisieren. Aber wenn Hibernate die Entität nicht als schmutzig ansieht, wird es nichts, was ich bisher gesehen habe, auflösen. – ewernli

+0

yep - flush() hilft hier nicht, da keine Änderungen vorgenommen werden – gubrutz

1

Guter Trick, aber achten Sie auf transiente Objekte, bevor Sie diese in einen Automatisierungscode einfügen. Für Transienten habe ich StaleStateObjectException

3

dann für Transienten, können Sie überprüfen,

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