2011-01-11 7 views
2

Ich habe zwei Entitäten, Transaktion und Eintrag. Die Transaktion hat einige eigene Daten und eine Liste von einem oder mehreren Einträgen, die aus einem Soll- und einem Habenbetrag besteht. In einem Teil der Anwendung muss ich fast alle entfernen und festgestellt, dass JPQL in diesem Fall am einfachsten und schnellsten ist.JPA auf Datenbankänderungen aufmerksam machen

ich diesen Code ausführen:

entityManager.createQuery(
       "DELETE FROM Entry e WHERE e IN (:entries)"). 
       setParameter("entries", new ArrayList<Entry>(
       entriesToRemove)).executeUpdate(); 
entityManager.createQuery(
       "DELETE FROM Transaction e WHERE e IN (:transactions)"). 
       setParameter("transactions", new ArrayList<Transaction>(
       transactions)).executeUpdate(); 

Das Problem später im Code ist, noch in derselben Transaktion (Ausführungsgeschäft dieses Mal) ich alle Einträge zu durchqueren müssen, die auf einigen Transaktionen vorhanden ist, die EntityManager gibt mir noch die Transaktionen, die ich gerade erst entfernt habe.

Ich vermute, dass es eine Möglichkeit geben sollte, dieses Ereignis zu behandeln, in meinem Beispiel führe ich einfach zwei JPQLs löschen aus, aber ich hätte auch einen externen Dienst oder etwas anderes außerhalb der Datenbank aufrufen können. In jedem Fall muss ich sicherstellen, dass der Cache des EntityManagers immer noch gültig ist, da er jetzt immer noch die gelöschten Objekte enthält.

Ich habe versucht mit entityManager.flush(); nach diesen löscht es zu keinem Erfolg. Da verwende ich executeUpdate(); Die Löschungen werden sofort in die darunterliegende Datenbank geleert, so dass ich nicht wirklich erwartet habe, dass sie hilft.

Schätzen Sie alle Zeiger, Hinweise und Antworten.

Antwort

0

Sie den gesamten Cache löschen können, die clear() Methode von EntityManager Schnittstelle

Oder, wenn Sie wissen, dass alle Transaktionen zu einem bestimmten Konto gehört, können Sie refresh(Object entity) im EntityManager für das Account Objekt aufrufen.

0

Das Problem später im Code ist, noch in derselben Transaktion (Ausführungsgeschäft dieses Mal) Ich alle Einträge zu durchqueren müssen, die auf einige Transaktionen besteht, die EntityManager gibt mir immer noch die Transaktionen, die ich gerade kürzlich entfernt.

Flush-Modus

  • AUTO ist das Standardverhalten. Alle Aktualisierungen, die Sie innerhalb Ihrer Transaktion vorgenommen haben, werden gelöscht, damit Ihre Abfrage diese Änderungen übernimmt.

  • COMMIT bedeutet, dass Änderungen nur gelöscht werden, wenn die Transaktion festgeschrieben wird, nicht vor einer Abfrage.

Wahrscheinlich, wenn Sie FlushModeType.COMMIT verwenden, dann kann das Problem auftreten, da die Änderungen auf Transaktionscommit reflektiert werden nur & Sie zwei Abfragen innerhalb derselben Transaktion ausgeführt werden. Mit FlushModeType.AUTO sollte es funktionieren & sein Standard, so dass es nicht explizit erwähnt werden muss.

Wenn noch ein Problem besteht, können Sie versuchen, die Transaktion nach der ersten Abfrage zu übergeben.

0

Zunächst, sind Sie sicher, dass die Bulk-Delete-Anweisung notwendig ist? d. h. Sie werden einen unerwünschten Leistungsschwellenwert überschreiten, wenn Sie ihn nicht haben. Wenn Sie es nicht brauchen, können Sie session.delete(e) verwenden.

Andernfalls, wenn Sie Hibernate verwenden, können Sie, wie das Tag in Ihrer Frage angibt, session.evict(e) verwenden, um Entitäten manuell aus der Sitzung zu entfernen. Sie können mit dem empfohlenen Code here in die Ruhezustand-Sitzung gelangen.

Hoffe, dass hilft.

Verwandte Themen