公司最近全面轉用 Java, 現正對 EJB 的特性進行測試.
本人寫了一個簡單的 Session Facade 測試程式, 需要同時更新多個 Entity.try {
  UpdateEntity_1();
  UpdateEntity_2();
  UpdateEntity_3();
  UpdateEntity_4();
} catch (Exception e}
  // Do something here
}基於設計上的要求, UpdateEntity_1 必須確定成功才可執行餘下的更新.  而 4 個 Entity 必須在同一 transaction 內完成.在內部測試時發現, 如果 UpdateEntity_1 出現 System Error (例如 Duplication Key - 只為了測試系統錯誤而強行加入的, 正常情況下程式會先測試了.), 並不會進入 catch 內, 而是直接執行其他的更新.查看 EJB 的書本發覺, System Error 是不能在 EJB 中截取, 而 container 只會把錯誤傳給 caller.  最大問題是在錯誤發生後, 並不會即時得知, 必須執行 flush() 或者是整個程或完結.  因此, 不能在 UpdateEntity_1 出現 System Error 後, 停止執行其他更新.
請問如何可以在更新 Entity_1 後, 即時測出 System Error 而避免進行其他更新?  而多個更新必須在同一個 transaction 中完成, 而確保資料的一致.謝謝大家幫忙.

解决方案 »

  1.   

    暫時有個 解決方法, 但不太喜歡:try { 
      UpdateEntity_1(); 
      ReadEntity_1();
      UpdateEntity_2(); 
      ReadEntity_2();
      UpdateEntity_3(); 
      ReadEntity_3();
      UpdateEntity_4(); 
      ReadEntity_4();
    } catch (Exception e} 
      // Do something here 
    } 每次 presist 完就嘗試 read 剛才的 object, 系統就會即時偵試之前的 presist 是否成功, 如有錯誤就會即時產生 exception.
    但...感覺不太好, 要依靠之後的 statement 去偵測自己的錯誤.詢問了一些有經驗的人, 都是沒有進行偵試, 讓 container 先執行整個程序, 然後離開時才產生 exception, 由 caller 自己去截取 exception.  由於 container 進行 rollback 時, 不論是那裡出了問題, 都可以完全 rollback, 所以從 data 統一性的角度是不會出現問題的.  但就會執行了一些不必要的指令.請問大家有需要同時更新幾個 entity 的嗎?  大家如何進行測試當中的系統問題?
      

  2.   

    自己答自己:可以用 EntitiyManager.flush() 代替 read(), 同樣可以引發 presist 的 Exception.