我需要在實體監聽器中持久化一個新的實體對象, 但它只能在第一次調用時正常工作。如果實體監聽器中的實體管理器不能調用持久化
請看如下代碼:
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
爲什麼你的getEntityManager()方法受到保護? – fisc
我假設你在一個應用程序管理的持久化上下文中,對嗎? – aribeiro
喜aribeiro, 是的,我在jobss使用JTA,謝謝 –