카테고리 없음

Commit Listener 전에 Spring Hibernate

기록만이살길 2021. 2. 25. 05:29
반응형

Commit Listener 전에 Spring Hibernate

1. 질문(문제점):

각 최대 절전 모드 트랜잭션이 끝나기 전에 저장 프로 시저를 실행하는 방법을 찾고 있습니다.

@PostPersit 주석은 전체 트랜잭션이 아닌 하나의 엔티티에 바인딩되어 있기 때문에 여기서 도움이되지 않는다고 생각합니다.

각 @Transactional 메서드의 끝에 메서드 호출을 추가 할 수 있지만 그 솔루션은 실제로 만족스럽지 않습니다.

어떤 아이디어? 감사합니다 !

2. 해결방안:

원하는 것에 따라 두 가지 옵션이 있습니다.

Hibernate에 의해 모든 트랜잭션이 커밋되기 전에 액션을 수행하고 싶다면 Interceptor( javadoc )을 사용할 수 있습니다 .

public class BeforeTransactionCompletionInterceptor extends EmptyInterceptor {

    @Override
    public void beforeTransactionCompletion(Transaction tx) {
        // do something before commit
    }

}

이를 통해 코드는 Hibernate 레벨에서 모든 커밋 전에 실행됩니다. 즉, Spring을 통해 관리되지 않는 트랜잭션도 저장 프로 시저를 호출합니다.

반면에 Spring과 @Transactional주석이 관리하는 모든 커밋 전에 저장 프로 시저를 호출 하려면 Spring AOP를 사용해 볼 수 있습니다.

@Aspect
@Component
public class CallStoredProcedureBeforeCommitAspect implements Ordered {

    @Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
    public void transactionnalMethod() {}

    @After("transactionnalMethod()")
    public void callStoredProcedureAfter(JoinPoint joinPoint) {
        // do something after
    }

    @Override
    public int getOrder() {
        return a_higher_priority;
    }
}

AOP를 사용하면을 설정 @EnableTransactionManagement(order = a_lower_priority)하거나 XML에서 동등한 것을 설정하여 조언의 기본 실행 순서를 변경하는 것을 잊지 마십시오 . 그렇지 않으면 저장 프로 시저가 이전이 아닌 이후에 호출됩니다.

65807579
반응형