2012-11-22 35 views
1

我試圖找到一種方法,當列表中的某個元素由於建立的業務規則內的某個原因而失敗時(例如,當拋出我的定製異常時),我可以找到一種回滾方法我如何用spring roo做回滾?

示例如果列表中的一個元素失敗,則該想法不記錄任何東西)

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

回答

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); 
     } 
    } 
} 

這可以比持續元件和具有滾動更高效他們回來?

+0

謝謝,但如果該過程因任何原因未能堅持列表的最後一個元素...?我希望我可以捕獲錯誤,我想回滾 – Hector

+0

我已經更新了答案,以使保存記錄靜態並且是MyRecord實體類的一部分,以便客戶端可以通過如下方式保存列表:'MyRecord。 saveMyRecordsList(records);' –

+0

我試着做你建議我的,但我得到以下錯誤: 不允許在共享EntityManager上創建事務 - 使用Spring 事務或EJB CMT代替 – Hector

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?

+0

感謝您的幫助... – Hector