2016-05-23 5 views
0

handhabt, erhielt ich diesen Code. Ich bin mit Federverschluß und JPAWie man Feder jpa @ transactional und neue Einsätze vom catch Block

@Transactional 

public class MyClass { 

    public void createSomething() { 
     try { 
      saveAndFlush(); 
     } catch (Exception e) { 
      // Since error has occured I want to insert this information 
      // into a audit table 

      repository.saveAndFlush(); 

     } 
    } 

} 

Nun, wenn die Ausnahme auftritt, wird die Transaktion rückgängig gemacht und damit die Fehlertabelle Einsatz ist nicht passiert.

I

sehe
HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in XXXXX entry (don't flush the Session after an exception occurs) 

Um dies zu beheben, habe ich versucht, den Fehler Einsatz in einem neuen Verfahren mit @Transactional(propagation = Propagation.REQUIRES_NEW) auf dem Verständnis, markiert zu tun, dass die innere Transaktion würde abzuschließen und Außen würde ein Rollback

Aber ich sehe meine beabsichtigte Ausgabe nicht.

Bitte geben

+0

Korrekt. Es ist in der Tat ein Duplikat – Shiv

+0

@ Alan-Heu - auch wenn ich die Anweisungen in Ihrem ursprünglichen Thread befolge, sehe ich immer noch das gleiche Problem. Ich machte es als transactional in einzelnen Methoden und fügte hinzu, dass eine neue propogation erforderlich ist – Shiv

Antwort

1

die @Transactional von Klassenstufe entfernen, und es auf diese Methoden verwenden, die tatsächlich die Transaktionen durchführen. (wenn Sie in dieser Klasse natürlich mehr als eine Methode haben).

Wenn Sie möchten, dass unabhängige Transaktionen die Datenbank binden/zurücksetzen, dann verwenden Sie die REQUIRES_NEW-Propagierung für die Methode, die die globale Transaktion nicht stört.

Das Standardverhalten von '@Transactional' ohne jegliche Propagierung ist, der globalen (aufrufenden) Transaktion beizutreten, falls verfügbar, und falls nicht, eine neue Transaktion zu starten.

Da Sie eine globale Transaktion haben, wird sie vollständig zurückgesetzt. Stattdessen benötigen Sie unabhängige Transaktionen.

+0

Ich machte es als einzelne Transaktionen und sehe immer noch nicht funktioniert. – Shiv