복붙노트

[SPRING] JPA + Spring에서 예외 후 트랜잭션 롤백

SPRING

JPA + 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. ==============================

    1.메소드에 런타임 예외가 발생하면 @Transactional을 사용하여 롤백을 자동으로 수행합니다. 수동으로 할 필요는 없습니다. 아마도 그 예외를 잡아서는 안되며 대신 스택 추적이 아닌 표준 오류 페이지를 사용자에게 보여주는 상위 수준의 ExceptionHandler로 전달하십시오. 또한 메소드가 void로 표시되었지만 문자열을 반환합니다.

    메소드에 런타임 예외가 발생하면 @Transactional을 사용하여 롤백을 자동으로 수행합니다. 수동으로 할 필요는 없습니다. 아마도 그 예외를 잡아서는 안되며 대신 스택 추적이 아닌 표준 오류 페이지를 사용자에게 보여주는 상위 수준의 ExceptionHandler로 전달하십시오. 또한 메소드가 void로 표시되었지만 문자열을 반환합니다.

  2. ==============================

    2.사용자 정의 PersistenceExceptionTranslator와 함께 Spring의 예외 변환을 사용하여 PersistenceException을 유용한 것으로 변환 할 수 있습니다.

    사용자 정의 PersistenceExceptionTranslator와 함께 Spring의 예외 변환을 사용하여 PersistenceException을 유용한 것으로 변환 할 수 있습니다.

    오, btw, DAO 수준에서 @Transactional을 사용해서는 안됩니다. 서비스 수준에서 트랜잭션을 시작해야합니다.

  3. ==============================

    3.Spring ORM이 관리하는 실패한 트랜잭션을 롤백 할 방법이없는 것 같습니다. 질문에 표시된 코드는 서비스 클래스입니다. 퍼시스턴스 루틴을 별도의 DAO 클래스로 추출하고 서비스 클래스가 PersistenceExceptions를 처리하도록하는 것은 트릭을 수행했습니다.

    Spring ORM이 관리하는 실패한 트랜잭션을 롤백 할 방법이없는 것 같습니다. 질문에 표시된 코드는 서비스 클래스입니다. 퍼시스턴스 루틴을 별도의 DAO 클래스로 추출하고 서비스 클래스가 PersistenceExceptions를 처리하도록하는 것은 트릭을 수행했습니다.

  4. ==============================

    4.예외를 발생시키는 메소드에서 @Transactional (noRollbackFor = {PersistenceException.class})를 사용하십시오.

    예외를 발생시키는 메소드에서 @Transactional (noRollbackFor = {PersistenceException.class})를 사용하십시오.

  5. from https://stackoverflow.com/questions/5083020/roll-back-transaction-after-exception-in-jpa-spring by cc-by-sa and MIT license