2016-02-26 36 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事件)'
謝謝。 –

相關問題