我有以下情况,
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();
}
答案 0 :(得分:4)
如果您想要容器管理的事务,可以使用值为TransactionAttributeType.REQUIRES_NEW的@TransactionAttribute来注释saveObj
方法:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void saveObj(SomeObject obj)
{
...
}
这将确保每次调用saveObj
方法时都会启动一个新事务。与someEjbMethod
关联的现有事务将在每次调用saveObj
方法之前暂停。为saveObj
方法启动的每个事务都将在返回时提交,因此每个实体都将在数据库中自行更新。
答案 1 :(得分:1)
您可以请求UserTransaction,看看here以获得灵感。