Training, Workshops, Softwareentwicklung

Hibernate Tutorial

TX und Flush

Wenn wir eine Änderung an einem Objekt persistieren wollen, erfordert dies eine Transaktion.

Flush
Customer customer = em.find(Customer.class, 1L);

assertNotNull(customer);
assertEquals("Buck", customer.getFirstname());
assertEquals("Rogers", customer.getLastname());

customer.setFirstname("Alice");

em.getTransaction().begin();
em.flush(); (1)
em.getTransaction().commit();
1 flush innerhalb einer Transaktion speichert alle Änderungen, vorausgesetzt der EntityManager kennt das Objekt.

Tatsächlich ist es so, dass im Default Flush-Modus die flush() Operation automatisch vor jedem commit() ausgeführt wird, so dass wir die Funktion gar nicht aufrufen müssen.

Automatisches Flush
Customer customer = em.find(Customer.class, 1L);

assertNotNull(customer);
assertEquals("Buck", customer.getFirstname());
assertEquals("Rogers", customer.getLastname());

customer.setFirstname("Alice");

em.getTransaction().begin();
// we do not need to call flush() in the default FlushMode
em.getTransaction().commit();

Dies ist der einzige Weg, um Änderungen zu speichern. Hibernate vergleicht beim flush() alle Objekte aus dem First-Level-Cache mit dem Zustand, den sie in der Datenbank haben. Besteht ein Unterschied, so wird das Objekt gespeichert.

Den Ablauf könnt Ihr Schritt für Schritt im Screencast nachvollziehen: