Ich verstehe nicht, das unten stehende Verhalten:
Ich habe eine Methode:
@Transactional
public void processRejection(final Path path) {
try {
//some code here
} catch (final Exception e) {
this.handleException(e));
}
}
welche die unter den Anrufen hat eine saves
eine Einheit , die noch nicht in der Datenbank vorhanden:
void handleException(final Throwable e) {
this.filesMonitoringJpaManager.save(someEntityHere);
throw new Exception(...)
}
Nun ist die seltsam ist , wenn ich kommentieren , die throw new Exception(...)
die save
Werke, aber wenn ich die Auskommentierung throw new Exception(...)
dann das save
nicht funktioniert und ich habe keine Ahnung , warum?
Was seltsames Verhalten ist, dass von JPA oder Hibernate? Ist es etwas über Java Exception-Mechanismus, die ich nicht verstehe?
@Transactional
gemeint ist ein Rollback , wenn etwas schief geht (eine Ausnahme ausgelöst). Sie Speichern einer Einheit in dem catch
Block, aber Sie Erneutes Auslösen eine Ausnahme verursacht die Transaktionsverfahren zur Zurückdrängung.
Sie können jedoch eine Ausnahme geben, das wird nicht Rollback verursachen:
@Transactional(noRollbackFor = {MyException.class})
public void processRejection(final Path path) {
try {
//somecode here whatever
} catch (final Exception e) {
this.handleException(e));
}
}
void handleException(final Throwable e) {
this.filesMonitoringJpaManager.save(someEntityHere);
throw new MyException(...)
}
Dies funktioniert für org.springframework.transaction.annotation.Transactional
. Wenn Sie verwenden javax.transaction.Transactional
, dann können Sie es erreichen , indem Sie dontRollbackOn
Eigenschaft.