我怎么用spring roo回滚?

时间:2012-11-22 12:56:36

标签: persistence spring-roo rollback jta

我正在尝试找到一种方法,允许我在列表中的某个元素因建立的业务规则中的原因失败时进行回滚(即:抛出我的自定义异常时)

示例,(如果列表中的一个元素失败,则该想法不会记录任何内容)

public class ControlSaveElement {

 public void saveRecords(List<MyRecord> listRecords) {

  Boolean status = true;

  foreach(MyRecord element: listRecords) {
     // Here is business rules
     if(element.getStatus() == false) {
        // something
        status = false;
     }
     element.persist();
  }

  if(status == false) {
     // I need to do roll back from all elements persisted before
  }
 }

...
}

有什么想法吗?我正在使用Roo 1.2.2 ..

2 个答案:

答案 0 :(得分:2)

您所描述的是需要交易的服务方法(saveRecords)。使用@Transactional注释进行注释然后引发异常,或者您将不得不考虑使用TransactionTemplate来获得更好的控制以进行手动回滚。

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html

http://springinpractice.com/2008/03/18/annotation-based-transactions-in-spring/

is there a way to force a transactional rollback without encountering an exception?

答案 1 :(得分:1)

如何在MyRecord实体中创建新的静态方法:

@Transactional
public static void saveMyRecordsList(List<MyRecord> listRecords) {

  boolean persistAll = true;

  foreach(MyRecord element: listRecords) {
     if(element.getStatus() == false) {
        persistAll = false;
     }
  }

  if (persistAll) {
      foreach(MyRecord element: listRecords) {
         entityManager().persist(element);
      }
  }
 }

这可能比持久元素更有效并且不得不回滚它们?