1

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

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

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 ..

4

2 回答 2

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/

有没有办法在不遇到异常的情况下强制事务回滚?

于 2012-11-23T01:09:33.610 回答
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);
      }
  }
 }

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

于 2012-11-24T17:11:46.470 回答