2016-11-03 4 views
1

스프링 MC 컨트롤러가있는 웹 응용 프로그램이 있습니다. 이러한 컨트롤러는 JPA, 엔티티 및 리포지토리와 함께 DB와 상호 작용합니다.컨트롤러에서 예외가 발생하면 JPA 롤백 트랜잭션이 발생합니다.

컨트롤러 메소드가 스프링 mvc에 의해 처리 될 때 프로세스 중에 예외가 발생하면 해당 메소드 중에 추가되는 모든 DB 변경 사항이 롤백됨을 확인하고 싶습니다. 여기에 예를

:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

컨트롤러

@Controller 
public class JpaTest { 

    @Autowired 
    GroupRepository groupRepository; 

    @RequestMapping(value = "/{langId}/jpatest", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
    @ResponseBody 
    @Transactional 
    public String test() throws Exception { 
     Group group = new Group(); 
     group.setName("jpaTest"); 
     groupRepository.save(group); 
     throw new Exception("MY EXCEPTION "); 
    } 
} 

나는 그룹이 DB에 추가되지 않습니다 기대!

나는 @Transactional이 그것을 만들었지 만 좋지 않을 것이라고 희망한다.

나는
<tx:annotation-driven transaction-manager="transactionManager" /> 

그러나 어떤 효과를 추가했습니다. 간단하게 처리 할 수있는 방법이 있습니까?

가 아니면 우리가 지브와 함께했던 것처럼 내 디스패처 서블릿, 슈퍼 트랜잭션 관리의 종류를 가지고 캡슐화 수 :

protected void doDispatch(final HttpServletRequest request, final HttpServletResponse response) throws Exception { 
    JeevesDispatcherServlet.super.doDispatch(request, response); 

    TransactionManager.runInTransaction("jeevesDispatchServlet", getWebApplicationContext(), 
     TransactionManager.TransactionRequirement.CREATE_ONLY_WHEN_NEEDED, 
     TransactionManager.CommitBehavior.ONLY_COMMIT_NEWLY_CREATED_TRANSACTIONS, 
     false, new TransactionTask<Void>() { 
      @Override 
      public Void doInTransaction(TransactionStatus transaction) throws Throwable { 
       JeevesDispatcherServlet.super.doDispatch(request, response); 

       return null; 
      } 
     }); 
} 

답변

-2

왜 당신은 하나의 삽입에 대한 트랜잭션을 원하십니까/액션을 저장합니다. 저장이 실패하면 롤백 아무것도 없다, 그래서 저장되지 않습니다

+0

댓글이어야합니다. – zero01alpha

1

이 가장 좋은 디자인이 아니라 필요한 경우, 당신이 throw 절보다 구체적인 예외 @TransactionalrollbackFor 속성을 시도 할 수 있습니다 .

post을보세요.

관련 문제