[SPRING] JPA + Spring에서 예외 후 트랜잭션 롤백
SPRINGJPA + Spring에서 예외 후 트랜잭션 롤백
HIbernate와 함께 Spring과 JPA를 사용하고 있습니다. PersistenceException이 발생하면 그것을 잡아서 오류 메시지를 반환하여 호출자에게 전파되지 않도록합니다.
@Transactional
public String save(Object bean) {
String error = null;
try {
EntityManager entityManager = getEntityManager();
for (int i = 0, n = entities.size(); i < n; i ++) {
entityManager.merge(entities.get(i));
}
}
catch (PersistenceException e) {
error = e.getMessage();
}
return error;
}
그러나 javax.persistence.RollbackException : 트랜잭션이 rollbackOnly로 표시되었다는 예외가 발생합니다. 예외 후에 트랜잭션을 롤백해야하지만 예외를 발견하고 다시 발생시키지 않으려면 어떻게 롤백해야합니까?
해결법
-
==============================
1.메소드에 런타임 예외가 발생하면 @Transactional을 사용하여 롤백을 자동으로 수행합니다. 수동으로 할 필요는 없습니다. 아마도 그 예외를 잡아서는 안되며 대신 스택 추적이 아닌 표준 오류 페이지를 사용자에게 보여주는 상위 수준의 ExceptionHandler로 전달하십시오. 또한 메소드가 void로 표시되었지만 문자열을 반환합니다.
메소드에 런타임 예외가 발생하면 @Transactional을 사용하여 롤백을 자동으로 수행합니다. 수동으로 할 필요는 없습니다. 아마도 그 예외를 잡아서는 안되며 대신 스택 추적이 아닌 표준 오류 페이지를 사용자에게 보여주는 상위 수준의 ExceptionHandler로 전달하십시오. 또한 메소드가 void로 표시되었지만 문자열을 반환합니다.
-
==============================
2.사용자 정의 PersistenceExceptionTranslator와 함께 Spring의 예외 변환을 사용하여 PersistenceException을 유용한 것으로 변환 할 수 있습니다.
사용자 정의 PersistenceExceptionTranslator와 함께 Spring의 예외 변환을 사용하여 PersistenceException을 유용한 것으로 변환 할 수 있습니다.
오, btw, DAO 수준에서 @Transactional을 사용해서는 안됩니다. 서비스 수준에서 트랜잭션을 시작해야합니다.
-
==============================
3.Spring ORM이 관리하는 실패한 트랜잭션을 롤백 할 방법이없는 것 같습니다. 질문에 표시된 코드는 서비스 클래스입니다. 퍼시스턴스 루틴을 별도의 DAO 클래스로 추출하고 서비스 클래스가 PersistenceExceptions를 처리하도록하는 것은 트릭을 수행했습니다.
Spring ORM이 관리하는 실패한 트랜잭션을 롤백 할 방법이없는 것 같습니다. 질문에 표시된 코드는 서비스 클래스입니다. 퍼시스턴스 루틴을 별도의 DAO 클래스로 추출하고 서비스 클래스가 PersistenceExceptions를 처리하도록하는 것은 트릭을 수행했습니다.
-
==============================
4.예외를 발생시키는 메소드에서 @Transactional (noRollbackFor = {PersistenceException.class})를 사용하십시오.
예외를 발생시키는 메소드에서 @Transactional (noRollbackFor = {PersistenceException.class})를 사용하십시오.
from https://stackoverflow.com/questions/5083020/roll-back-transaction-after-exception-in-jpa-spring by cc-by-sa and MIT license