java - 如果 Controller 中抛出异常,Spring JPA 回滚事务

标签 java spring-mvc spring-data-jpa transactional

我有一个带有大量 Spring MVC Controller 的 Web 应用程序。 这些 Controller 通过 JPA、实体和存储库与数据库进行交互。

我想确保当 spring mvc 处理 Controller 方法时,如果在此过程中抛出任何异常,则在该方法期间追加的所有数据库更改都会回滚。

这里是一个例子:

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

Controller

@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 ");
    }
}

我希望该组未添加到数据库中!

我希望@Transactional 能够成功,但没有。

我添加

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

但是没有效果。 有没有简单的方法?

或者我可以封装我的调度程序 Servlet 以进行 super 事务管理,就像我们对 jeeves 所做的那样:

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;
            }
        });
}

最佳答案

这不是最好的设计,但如果需要的话, 您可以尝试使用 throw 子句和 @TransactionalrollbackFor 属性来尝试更具体的异常。

看看这个 post .

关于java - 如果 Controller 中抛出异常,Spring JPA 回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40403636/

相关文章:

spring-boot - Spring Boot @Transaction(timeout = 1)

java - 如何从字符串变量java的最后一个字符中解脱出来

java - Spring加载一个只有空成员变量的配置类

Java 持久性 - getSingleResult() 未检索任何实体

java - 为什么 pageContext.request.contextPath 被视为字符串而不是类路径?

java - 使用 Java Spring 标签的 URI

GAE 上的 Spring Boot Rest App 抛出异常无法转换为 javax.persistence.EntityManagerFactory”

java - 模拟一个 CrudRepository findById ("111".get ()

java - 对象名称无效

java - Spring Boot 正在覆盖数据