Es wird normalerweise nicht empfohlen, Flush explizit aufzurufen, es sei denn, dies ist erforderlich. Im Ruhezustand ruft Flush normalerweise am Ende der Transaktion automatisch auf, und wir sollten es funktionieren lassen. In einigen Fällen müssen Sie möglicherweise explizit Flush aufrufen, wobei eine zweite Aufgabe vom Ergebnis der ersten Persistenzaufgabe abhängt, die sich beide in derselben Transaktion befinden.
Beispielsweise müssen Sie möglicherweise eine neue Entität beibehalten und dann die ID dieser Entität verwenden, um eine andere Aufgabe innerhalb derselben Transaktion auszuführen. In diesem Fall muss die Entität zuerst explizit geleert werden.
@Transactional
void someServiceMethod(Entity entity){
em.persist(entity);
em.flush()
doSomeThingElse(entity.getId());
}
Beachten Sie außerdem, dass das explizite Leeren kein Datenbank-Commit verursacht. Ein Datenbank-Commit wird nur am Ende einer Transaktion durchgeführt. Wenn also nach dem Aufruf von Flush ein Laufzeitfehler auftritt, werden die Änderungen weiterhin rückgängig gemacht.
sessionFactorymit der@TransactionalAnnotation injizieren , wenn Sie es sich ansehen. Ab diesem Zeitpunkt muss Ihr Code nicht mehr überall transaktional sein (dies ist jedoch in einigen Situationen erforderlich).