如何回滚 spring jpa repo.save() 函数

Maz*_*aze 5 java jpa spring-data-jpa

我看过关于这个主题的几个不同的帖子,但大多数都认为它不起作用。我想做的是在循环中保存多个对象,但如果其中一个失败 -> 回滚所有保存的对象。

这是我当前的代码。

@Override
public Fleet saveFleet(String fleetId, List<String> serialNoList) {

    fleet = new Fleet();
    Fleet tempFleet = new Fleet();
    fleet.setKey(new FleetKey());

    //Change this to string utils uppercase
    fleet.getKey().setFleetId(StringUtils.upperCase(fleetId));
    fleet.getKey().setUserId(StringUtils.upperCase(userService.getCurrentUser().getUserId()));
    fleet.getKey().setDealerCd("USER");

    for (int i = 0; i < serialNoList.size(); i++) {
        //Try catch block?

           tempFleet = fleetRepo.save(fleet);
       }
    //commit if all the data goes correctly, rollback if there is an exception. 
    return tempFleet;
}
Run Code Online (Sandbox Code Playgroud)

Jav*_*hip 5

添加@Transactional(rollbackFor = Exception.class)到方法的顶部。如果数据库抛出任何异常,Spring将为您回滚该事务内的所有数据。


Uri*_*oya 4

正如其他人提到的,您可以使用@Transactional: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html

它实际上做的是:

try { 
   transaction.begin(); 
   saveFleet(fleetId, serialNoList);
   transaction.commit(); 
} catch(Exception ex) { 
   transaction.rollback(); 
   throw ex; 
} 
Run Code Online (Sandbox Code Playgroud)