각 최대 절전 모드 트랜잭션이 끝나기 전에 저장 프로 시저를 실행하는 방법을 찾고 있습니다.
@PostPersit 주석은 전체 트랜잭션이 아닌 하나의 엔티티에 바인딩되어 있기 때문에 여기서 도움이되지 않는다고 생각합니다.
각 @Transactional 메서드의 끝에 메서드 호출을 추가 할 수 있지만 그 솔루션은 실제로 만족스럽지 않습니다.
어떤 아이디어? 감사합니다 !
각 최대 절전 모드 트랜잭션이 끝나기 전에 저장 프로 시저를 실행하는 방법을 찾고 있습니다.
@PostPersit 주석은 전체 트랜잭션이 아닌 하나의 엔티티에 바인딩되어 있기 때문에 여기서 도움이되지 않는다고 생각합니다.
각 @Transactional 메서드의 끝에 메서드 호출을 추가 할 수 있지만 그 솔루션은 실제로 만족스럽지 않습니다.
어떤 아이디어? 감사합니다 !
원하는 것에 따라 두 가지 옵션이 있습니다.
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에서 동등한 것을 설정하여 조언의 기본 실행 순서를 변경하는 것을 잊지 마십시오 . 그렇지 않으면 저장 프로 시저가 이전이 아닌 이후에 호출됩니다.