2016-02-26 47 views
0

我需要在实体监听器中持久化一个新的实体对象, 但它只能在第一次调用时正常工作。如果实体监听器中的实体管理器不能调用持久化

请看如下代码:

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, [email protected]bece143 >: java.lang.NullPointerException 

... 

javax.ejb.EJBTransactionRolledbackException: Transaction rolled back 

... 

Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction. 

但新的对象已经保存到数据库

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) 

任何人都可以帮忙?非常感谢。

工作环境

  • JBoss的eap6.2
  • Oracle11g的
  • 的EclipseLink 2.4.1
+0

为什么你的getEntityManager()方法受到保护? – fisc

+0

我假设你在一个应用程序管理的持久化上下文中,对吗? – aribeiro

+0

喜aribeiro, 是的,我在jobss使用JTA,谢谢 –

回答

0

一旦实体承诺,该实体已分离。通过第一次调用persist()来执行提交,导致您的实体分离。您可以做的是在致电另一个persist()之前再次开始交易。

getTransaction().begin(); 
+0

感谢伯纳德, **我使用JTA事务类型,所以不能用getTranscation()()开始。** 其实这里只有一次承诺。 我在我的问题上更新了实体代码和ejb代码的详细信息,谢谢 –

+0

呵呵,那么我想你可以用'@ javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRES_NEW)'''preUpdate() –

+0

感谢伯纳德,
的entitylistener类不是一个EJB,所以它进行注释不能在这里工作,我改变了代码bolew并保存新的对象现在的工作 >'SomListener延伸DescriptorEventAdapter'
>'更新前(DescriptorEvent事件)'
谢谢。 –