Java 如何在EJB中提交事务?
我有下面的场景Java 如何在EJB中提交事务?,java,transactions,ejb,Java,Transactions,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++) {
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();
}
您可以请求UserTransaction,看看是否有灵感。如果您想要容器管理的事务,您可以使用@TransactionaAttribute和值将
saveObj
方法注释为:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void saveObj(SomeObject obj)
{
...
}
这将确保每次调用
saveObj
方法时都会启动一个新事务。与somejbmethod
关联的现有事务将在每次调用saveObj
方法之前暂停。为saveObj
方法启动的每个事务都将在返回时提交,因此每个实体都将在其自己的事务中在数据库中更新。您所说的“仍然不工作”是什么意思?事务创建是否在每次调用或其他操作时失败?此外,考虑允许JTA协调员进行更精细的调试;您将能够确定是否正在启动新事务。我的意思是,不会在每次退出saveObj
时更新数据库。但是,在app server日志中,已打印更新sql查询。您使用的JPA提供程序是什么?如果您使用EclipseLink,您是否将提供程序与集成?我使用oc4j 10.1.3.4作为EJB容器,并将其捆绑的toplink作为JPA实现。我可以想到一个可能的原因-是否有一个EJB jar.xml
或orion EJB jar.xml
文件,其条目将覆盖注释?通常,容器使用注释中声明的属性,除非有描述这些值的部署描述符。发生冲突时,部署描述符中的值优先。