2014-02-23 2 views
2

존재하는 경우 저장소는 예외가 발생하지 않습니다.
garageFacade에서 updateGarage를 @Transactional 주석으로 호출하면 garageRepository가 예외를 throw하지 않습니다.
@Transactional 주석이없는 동일한 메소드를 호출하면 garageRepository가 고유 위반 예외를 던지고 이제 BoozinaExceptions.getCodeException(garage, e)을 사용하여 예외를 변환 할 수 있습니다.스프링 데이터 JPA는 @Transactional 나는 다음과 같은 수업을

@Transactional 주석이있을 때 스프링 jpa 데이터가 커밋을 실행할 때 예외가 throw되기 때문에이 문제가 발생합니다. GarageBO.updateGarage를 실행 한 후에 이런 일이 발생합니까?

하지만 고유 한 위반 사항을 변환해야합니다. 내가 어떻게 할 수 있니?
커밋 후 스프링 예외를 처리하고 예외로 변환하는 방법은 무엇입니까?

+0

garage 엔티티가 존재하지 않고이를 저장하려고하면 catch 블록이 실행되고 예외를 변환 할 수 있습니다. 그러나 garage 엔티티가 이미 존재하면 catch 블록이 실행되지 않고이 줄이 최대 절전 모드 로그에 나타납니다. HHH000010 : 배치의 릴리스시 JDBC 문이 여전히 포함되어 있습니다 –

답변

4

예상되는 동작을 설명합니다. 메소드가 끝난 후에 트랜잭션이 커밋됩니다. 커밋은 고유 한 제약 조건 위반을 초래합니다.

@Transactional을 서비스 메소드에 추가하면 트랜잭션이 커밋 된 서비스 메소드를 호출 한 후 트랜잭션이 종료됩니다. 제거하면 저장소 메소드를 호출 한 후 트랜잭션이 커밋됩니다.

또한 왜 BO에 Facade와 Repository가 있습니까?! 기본적으로 BO와 Facade는 동일한 IMHO입니다.

이 문제가 가지고 해결하는 방법 GarageRepository JpaRepository 대신 PagingAndSortingRepository의 확장 save 대신 saveAndFlush 메서드를 호출합니다. 그러면 sql (트랜잭션 커밋 안 함)이 실행되고 제약 조건 위반 예외가 트리거됩니다.

다른 해결책은 변환을 수행하는 BO 작성 및 Aspect에서 try/catch를 수행하는 것입니다. 필요한 때마다 try/catch 코드를 저장합니다.

+0

외관이 하나 이상의 BO와 상호 작용할 수 있기 때문에 BO와 Facabe이 있습니다. 실재. 예 : GarageFacade에는 GarageBO 및 MessageBO가 있습니다. Garage를 만들면 Garage 엔티티를 만들고 MessageBO로 이메일을 보내기 때문입니다. 그러나 나는 또한 전자 메일을 보내지 않고도 차고를 만들거나 차고를 만들지 않고 전자 메일을 보낼 수 있습니다. –

+0

고마워, 완벽하게 작동합니다. –

관련 문제