2014-06-10 56 views
0

我有以下情形:在有一些製表使用多個EJB在從CDI一個事務保存數據管理豆

我有一個JSF對話框(Primefaces)。該對話框具有「確定」按鈕。如果點擊「確定」,所有在製表機中的數據應該保存在一個事務中。問題在於每個製表關聯(CDI)會話作用域支持bean,並且每個支持bean都具有「保存」 - 方法在無狀態EJB的幫助下保存特定製表符的數據。

我該怎麼做才能讓所有與EJB相關的代碼都保存在一個事務中。

我已經知道:

  1. 狀態EJB。 (此方法需要重寫狀態EJB調用並將它們委派給有狀態的EJB)。
  2. 寫全局無狀態EJB,節省了數據(此方法需要從每個會話bean數據)

有可能是製表(CDI)會話支持bean會在另一個地方重新使用。所以它應該是獨立的。 你認爲什麼是一個好方法?

編輯:僞代碼:

@SessionScoped 
class BackingBeanTab1 { 
    //CDI session scoped bean for Info in Tab1 
    String firstname; 
    String lastname; 

    @Inject StatelessTab1DAO dao1; 

    public void save() { 
     dao1.save(..); 
    } 
} 

@Stateless 
class StatelessTab1DAO { 
    public void save (...); 
} 

Similar for Tab2 ... 

@SessionScoped 
class BackingBeanTab2 { 
    //CDI session scoped bean for Info in Tab1 
    int debit; 

    @Inject StatelessTab2DAO dao1; 
    public void save(); 
} 

@Stateless 
class StatelessTab2DAO { 
    public void save (...); 
} 

採用這種設計,我可以重複使用的每個製表。但是,有什麼好的可能性可以保存在一個交易中?

回答

0

它取決於您的應用程序,但通常來自選項卡的數據應該保存在臨時存儲區(會話或有狀態的bean)中,然後保存在對話框確定按鈕上。有可能是至少有幾個選項:

  • 使用狀態bean作爲門面

你的門面實現您無狀態bean,並在其變量存儲數據的所有方法,一旦確定按鈕被點擊它調用在Facade上保存方法,Facade調用每個無狀態會話Bean來保存數據 - 所有事務都保存或回退。

  • 臨時存儲使用HTTP會話

這是當前的設計,因爲我從描述相信。但是您的支持bean應該只保留會話中的數據,而不是將其保存到數據庫中(因爲我的理解是必須填寫所有選項卡以使數據有效)。然後點擊確定按鈕時,你可以使用:

要麼UserTransaction對象開始事務,調用所有會話bean與所需的數據,並提交交易

或創建一個statless門面和調用這個門面與所有所需的數據(可以像在有狀態的例子中那樣調用所有其他會話bean),並讓容器處理事務管理。

+0

謝謝您的回答!數據存儲在(CDI)會話範圍的bean中。我用一個例子更新了我的問題。 –

+0

@JohnN我的回答是否足夠清晰,還是需要更多解釋? – Gas

0
如果你喜歡在一些其他的路徑代碼要比你可以試試這個

爲每個CDI驗證您可以使用Ajax調用,這樣卻使在表中的數據插入的數據也會相應驗證。並且爲了將數據保存在一個事務中,您可能需要在ejb bean中使用cmt或bmt事務,並且如果您使用的bmt比開始事務和提交事務應由開發人員完成onle