几个JpaRepositories方法的一个事务

时间:2013-11-13 12:35:45

标签: java spring jpa transactions

我有一些自动连接的接口扩展了JpaRepository。对于不同的实体,它们中的每一个都具有“更新”hql方法。我从服务的方法中调用这些方法。

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

服务已经归属于@service& @transactional,但它没有帮助。

------------------------ update

这是一个例子。 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();
    }   
  }
}

1 个答案:

答案 0 :(得分:1)

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

首先,我在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);

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