Entitymanager.flush () VS EntityManager.getTransaction (). Commit - Was sollte ich bevorzugen?
Was sollte ich bevorzugen, wenn die Aktualisierung der Datenbank? Was sind die Vorteile & Nachteile der beiden Verfahren und Wann werde ich die eine oder die andere?
public void disemployEmployee(Integer employeeId, Date endDate) {
Employee employee = (Employee)em.find("Employee", employeeId);
employee.getPeriod().setEndDate(endDate);
em.flush();
}
public void disemployEmployee(Integer employeeId, Date endDate) {
Employee employee = (Employee)em.find("Employee", employeeId);
em.getTransaction().begin();
employee.getPeriod().setEndDate(endDate);
em.getTransaction().commit();
}
InformationsquelleAutor der Frage Rox | 2012-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
In deinem ersten Beispiel, die änderungen an den Daten spiegeln sich in der Datenbank nach der Begegnung mit flush, aber es ist immer noch in der Transaktion.
Aber im zweiten Beispiel, Begehen Sie die Transaktion sofort. Deshalb werden die änderungen in die Datenbank & Transaktion endet auch dort.
Manchmal, Spülen kann nützlich sein, zur Speicherung der Daten zwischen den Laufenden Transaktion & schließlich übernehmen Sie die änderungen danach. So können Sie auch das rollback der vorherigen änderungen, wenn es Auftritt, ein problem im Nachhinein, wie für die batch einfügen/aktualisieren.
InformationsquelleAutor der Antwort Nayan Wadekar
Sie habe gelesen, dass die javadoc für die Unterputz-und zu Begehen, und weiß, dass flush ist nur für die Verwendung innerhalb eine Transaktion? Es spült (aber nicht verpflichten), während die commit-commit-Daten (offensichtlich). Sie unterscheiden sich; es gibt keine "Präferenz" zu haben. Das erste Beispiel ist falsch, und sollte im Ergebnis eine Ausnahme bei einem Aufruf von flush (TransactionRequiredException)
InformationsquelleAutor der Antwort DataNucleus
Beiden code-Beispiele nicht persist oder merge entity state geschrieben werden, DB.
Ich glaube nicht, dass es angemessen zu vergleichen
EntityManager.flush()
undEnityManager.EntityTransaction.commit()
.flush() eingeschlossen werden MÜSSEN, in einen Transaktionskontext, und Sie nicht haben, um es explizit tun, es sei denn, die benötigt (in seltenen Fällen), wenn EntityTransaction.commit() übernimmt das für Sie.
Siehe diesen link Ist es notwendig, rufen Sie eine flush () - (JPA-Schnittstelle) in dieser situation?
Siehe diesen link Frage zur Spülung mit JPA, bevor eine Abfrage aufgerufen wird für ein Szenario für die Verwendung der flush () -
InformationsquelleAutor der Antwort Ahamed Mustafa M
Ich würde für container-verwaltete Transaktion, Wann immer möglich. Bean-verwaltete Transaktionen erfordern in der Regel deutlich mehr code, weil der Ausnahme-Möglichkeiten. Auch, es ist eher fehleranfällig (rollbacks, Ressourcen-management).
Sagte, ich würde mit einem flush nach der übergabe in container-managed-mode. So kann ich fangen möglich PersistenceExceptions in meinem Speicher-Modul und wandeln Sie es um ein paar sinnvolle Ausnahme für meinen use-case-Modul. Das, weil ich nicht wollen, behandeln storage-spezifische Ausnahmen hier, weil ich vielleicht tauschen Sie das Speichermodul aus für etwas, das nicht verwenden, JPA,... was mir noch nie passiert 🙂
InformationsquelleAutor der Antwort Dormouse
Ich denke, der fehlende Teil ist, flush() einfach auf die Datenquellen an, fertig zu Begehen, gibt die tatsächlichen ids aber nicht beibehalten standardmäßig.
Also, wenn Sie brauchen flush() arbeiten als commit() müssen Sie den flush-Modus zu Verpflichten, in der EntityManager von:
Beachten Sie, dass FlushModeType ist ein enum, der hat diese beiden Werte:
Ich hoffe, dass dies helfen
InformationsquelleAutor der Antwort مريم قد الحياة