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();