2011-06-26 97 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查询得到了打印 –