java - 多个 JpaRepositories 方法的一个事务

标签 java spring jpa transactions

我有一些 Autowiring 的接口(interface)扩展了 JpaRepository。他们每个人都有针对不同实体的“更新”hql 方法。我从服务的方法中调用这些方法。

如果其中一个失败,我如何让它们在一个事务中执行以回滚所有数据?

服务有属性@service 和@transactional,但它没有帮助。

------------------------更新

举个例子。 repository1.updateMethod() 和 repository2.updateMethod() 工作正常,repository3.save 抛出异常因为约束错误。结果,我看到 repository1 和 repository2 方法的结果已保存。我需要它回滚。

@ Service
@ Transactional(rollbackFor = {RuntimeException.class})
public SomeService {
  @ Autowired SomeRepository repository1;
  @ Autowired AnotherRepository repository2;
  @ Autowired ThirdRepository repository3;
  ...
  @ Transactional(rollbackFor = {RuntimeException.class})
  public void SomeMethod(SomeEntity obj, String someNewValue) {
    try {
      repository1.updateMethod();
      repository2.updateMethod();
      obj.setValue(someNewValue);
      repository3.save(obj);
    } catch (Exception ex) {
      throw new RuntimeException();
    }   
  }
}

最佳答案

我想我找到了一个解决方案,但我仍然不明白为什么它在默认用法下不起作用。

首先,我在 applidationData.xml 中声明了 JpaTransactionManager

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

并在服务中使用它:

@Autowired
JpaTransactionManager jtm;

在我添加的代码之前:

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("TxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus ts = jtm.getTransaction(def);

最后

jtm.commit(ts);

现在,如果某个方法产生异常,它会在最后一行抛出并且所有更新都将回滚。这就是我所需要的。但是,正如我所说,我仍然不明白为什么它在默认用法下不起作用。

关于java - 多个 JpaRepositories 方法的一个事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19953959/

相关文章:

java - 在 Android 中使用 Map 无法看到图片中的 map

java - 如何从 Spring 批处理作业中终止步骤

java - CriteriaBuilder 选择多对多

java - 如何为实体创建单独的项目?

java - Google App Engine 如何预编译 Java?

java - 如何在Spring Controller 类中使用路径变量?

java - 设置@Value 以使用@ConfigurationProperties 前缀

spring - @Converter 注释的类在 spring-boot 项目中未自动检测到

java - @OneToMany 映射的 Hibernate 用户字符串字段

java - 可以批准参数的类定义 - 带有对象和构造函数