No entiendo el comportamiento a continuación:
Tengo un método:
@Transactional
public void processRejection(final Path path) {
try {
//some code here
} catch (final Exception e) {
this.handleException(e));
}
}
que llama a la debajo de la cual funciona una saves
entidad que no lo hace todavía existe en la base de datos:
void handleException(final Throwable e) {
this.filesMonitoringJpaManager.save(someEntityHere);
throw new Exception(...)
}
Ahora el extraño es cuando me comento las throw new Exception(...)
las save
obras, pero cuando Descomentar throw new Exception(...)
entonces el save
no funciona y no tengo ni idea de por qué?
Lo extraño es que el comportamiento de la APP o de hibernación? ¿Es algo sobre el mecanismo de excepciones de Java, que no entiendo?
@Transactional
tiene la intención de volver rollo cuando algo va mal (se produce una excepción). Usted está ahorrando una entidad en el catch
bloque, pero estás Regeneración de una excepción que causa el método transaccional para volver rollo.
Sin embargo, puede especificar una excepción, que no cause rollback:
@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(...)
}
Esto funciona para org.springframework.transaction.annotation.Transactional
. Si usted está utilizando javax.transaction.Transactional
, entonces se puede lograr mediante el uso de dontRollbackOn
la propiedad.