2016-11-03 30 views
1

我有一大堆spring mvc控制器的webapp。这些控制器使用JPA,实体和存储库与数据库进行交互。如果在控制器中抛出异常,则会弹出JPA回滚事务

我想确保当一个控制器方法由spring mvc处理时,如果在该过程中引发任何异常,则在该方法期间追加的所有数据库更改都会回滚。

下面的例子:

<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" /> 

但没有效果。 有没有办法简单地做到这一点?

或者,我可以概括了我的调度员Servlet来有那种超级事务管理的,就像我们与占道做:

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

相关问题