2011-06-26 69 views
0

我有以下情形,如何在EJB中提交事務?

public void someEjbMethod1() 
{ 
    for (int i=0; i=10; i++) 
    { 
     em.merge(arr[i]); 
     em.flush(); 
    } 
} 

我需要單獨合併的(arr[i])的每個對象。因爲上面的代碼將在函數結尾提交所有arr[i]實例。

我想做到以下幾點:

public void someEjbMethod1() 
{ 
    for (int i=0; i=10; i++) 
    { 
     saveObj(arr[i]); 
    } 
} 

// should I use a transaction attribute here?? 
public void saveObj(SomeObject obj) 
{ 
    em.merge(arr[i]); 
    em.flush(); 
} 

回答

1

您可以要求一個UserTransaction,有一些靈感一看here

4

如果你想容器管理的事務,您可以使用@TransactionAttribute與價值TransactionAttributeType.REQUIRES_NEW簽註saveObj方法:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void saveObj(SomeObject obj) 
{ 
    ... 
} 

這將確保一個新的事務將用於的每個調用啓動saveObj方法。與someEjbMethod相關聯的現有交易將在每次調用saveObj方法之前暫停。每次爲saveObj方法啓動的事務都將在返回時提交,因此每個實體都將在其自己的事務中更新到數據庫中。

+0

我做了你在OC4J上說的確切內容,但仍然不起作用 –

+0

你是什麼意思的「仍然不工作」?每次調用或其他事務都會導致事務創建失敗?另外,考慮啓用JTA協調器的更精細的調試;您將能夠確定新交易是否正在開始。 –

+0

我的意思是,數據庫不會在'saveObj'的每個出口得到更新,但是在應用服務器日誌中,更新sql查詢得到了打印 –