Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa can';如果实体侦听器中的实体管理器_Jpa_Jboss_Ejb - Fatal编程技术网

Jpa can';如果实体侦听器中的实体管理器

Jpa can';如果实体侦听器中的实体管理器,jpa,jboss,ejb,Jpa,Jboss,Ejb,我需要在实体侦听器中持久化一个新的实体对象, 但它只在第一次呼叫时工作良好 请参阅以下代码: public class SomeListener{ @PreUpdate public void preUpdate(SomeEntity o){ EntityManager em= EntityManagerUtils.getEntityManager(); em.persist(new OtherObj

我需要在实体侦听器中持久化一个新的实体对象, 但它只在第一次呼叫时工作良好

请参阅以下代码:

    public class SomeListener{
         @PreUpdate
         public void preUpdate(SomeEntity o){
             EntityManager em= EntityManagerUtils.getEntityManager();
             em.persist(new OtherObj());
         }
    }
    public class EntityManagerUtils {
        protected static EntityManager getEntityManager() throws Exception {
            Object sb = new InitialContext().lookup(JNDI_EntityLisenterSB);
            Method method = sb.getClass().getMethod("getEntityManager");
            return (EntityManager) method.invoke(sb);
    }}
在第二次呼叫后查看错误日志:

ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for SynchronizationImple< 0:ffffac19b619:7c4a5bbb:56cfb972:19e, org.eclipse.persistence.transaction.JTASynchronizationListener@7bece143 >: java.lang.NullPointerException

...

javax.ejb.EJBTransactionRolledbackException: Transaction rolled back

...

Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
有人能帮忙吗?非常感谢。

工作环境

  • jboss eap6.2
  • oracle11g
  • 日食2.4.1

一旦实体被提交,该实体就会分离。对
persist()
的第一次调用执行提交,导致实体分离。您可以做的是在调用另一个
persist()
之前再次开始事务


为什么您的getEntityManager()方法受到保护?我假设您在应用程序管理的持久性上下文中,对吗?你好,aribeiro,是的,我在jobss中使用JTA,谢谢Hanks Bernard,我使用的是JTA事务类型,所以无法使用GetTransaction().begin()。实际上这里只犯过一次罪。关于我的问题,我更新了详细的实体代码和ejb代码,谢谢,那么我想你可以用
@javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRES_NEW)注释你的
preUpdate()
方法,因此注释在这里不起作用,我将代码更改为bolew,现在保存新对象工作>
SOMSListener扩展DescriptorReventAdapter

预更新(DescriptorRevent事件)

谢谢。
at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1177)

at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:92) [jboss-as-ejb3-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
... 94 more
Caused by: java.lang.NullPointerException
    at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.updateObjectForWriteWithChangeSet(DatabaseQueryMechanism.java:1005) 
getTransaction().begin();