我有一大堆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;
}
});
}
这应该是一条评论 – zero01alpha