我需要在实体监听器中持久化一个新的实体对象, 但它只能在第一次调用时正常工作。如果实体监听器中的实体管理器不能调用持久化
请看如下代码:
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,谢谢 –