[hibernate-issues] [Hibernate-JIRA] Commented: (EJB-327) Cannot synchronize Tx with container managed JTA from within hibernate event listener

Adrian Pillinger (JIRA) noreply at atlassian.com
Wed Jan 9 11:33:55 EST 2008


    [ http://opensource.atlassian.com/projects/hibernate/browse/EJB-327?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_29270 ] 

Adrian Pillinger commented on EJB-327:
--------------------------------------

Sorry for posting my error here. I'd searched documentation and forums for how to use a new session in the listener with no luck - next time I'll also post a question there too.

Removing the beginTransaction() and adding a flush() fixed my problem. However, I still have a very nasty hack to my listener to get it working which potentially has side effects. 

See bug HHH-2763. 

My audit listener checks each state object to write the changes to an audit table, when it touches an item that has child collections that have not been loaded, hibernate lazily loads them. This constructs CollectionEntry objects with a processed flag of false and later in the execution throws an exception saying that they were not processed by flush().

I have added the following code to set the processed flags of all CollectionEntry objects to true in my listener to resolve the issue for now.  Hopefully as I am in the post-insert/post-update/post-delete all collections should have been processed and the only ones I'm changing are the ones loaded during the listener execution?!

	/**
	 * Marks all collection entries in the current persistence context as processed
	 * 
	 * @param session The current session
	 */
	private void markCollectionsAsProcessed(final Session session)
	{
		if (session instanceof SessionImplementor)
		{
			SessionImplementor sessionImpl = (SessionImplementor)session; 
			final PersistenceContext persistenceContext = sessionImpl.getPersistenceContext();
			final Map collectionEntries = persistenceContext.getCollectionEntries();
			final Collection values = collectionEntries.values();
			for (Object obj : values)
			{
				CollectionEntry ce = (CollectionEntry)obj;
				ce.setProcessed(true);
			}
		}
	}


Maybe hibernate should set the processed flag to true (or the ignore flag to true) when a collection is loaded during a flush?



> Cannot synchronize Tx with container managed JTA from within hibernate event listener
> -------------------------------------------------------------------------------------
>
>                 Key: EJB-327
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/EJB-327
>             Project: Hibernate Entity Manager
>          Issue Type: Bug
>          Components: EntityManager
>    Affects Versions: 3.3.1.GA
>         Environment: JBoss 4.2.0 GA, Hibernate 3.2.3 GA, DB2
>            Reporter: Adrian Pillinger
>            Priority: Blocker
>
> I am running within JBoss inside an EJB using container managed transactions. The transaction is running and my hibernate post-insert event listener gets fired. Within this post-insert event listener I am creating a new session and calling beginTransaction() in order to make further database updates in new session, but inside the same JTA transaction. 
> The begin transaction fails to synchronise with the current JTA transaction but there seems to be no apparent reason as to why this would fail.
> The listener code causing the problem is...
>     Session newSession = event.getPersister().getFactory().openSession();
>     newSession.beginTransaction();
> On the begin transaction call the exception thrown is
> 10:56:52,803 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
> org.hibernate.TransactionException: Could not register synchronization for container transaction
>         at org.hibernate.transaction.CMTTransaction.begin(CMTTransaction.java:45)
>         at org.hibernate.ejb.transaction.JoinableCMTTransaction.begin(JoinableCMTTransaction.java:70)
>         at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
>         at com.dolby.persist.listener.trigger.AuditTrigger.audit(AuditTrigger.java:67)
>         at com.dolby.persist.listener.trigger.AuditTrigger.fireAfterUpdateTrigger(AuditTrigger.java:293)
>         at com.dolby.persist.listener.trigger.TriggerEventListener.onPostUpdate(TriggerEventListener.java:522)
>         at org.hibernate.action.EntityUpdateAction.postUpdate(EntityUpdateAction.java:180)
>         at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:159)
>         at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
>         at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
>         at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
>         at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
>         at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:41)
>         at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:969)
>         at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1562)
>         at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
>         at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:305)
>         at com.dolby.persist.dao.hibernate.GenericHibernateFinderDAO.findById(GenericHibernateFinderDAO.java:250)
>         at com.dolby.persist.dao.hibernate.GenericHibernateCrudDAO.merge(GenericHibernateCrudDAO.java:112)
>         at com.dolby.pics.core.ejb.bean.impl.InventoryBean.save(InventoryBean.java:99)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:585)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
>         at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
>         at com.dolby.pics.core.ejb.bean.impl.DefaultInterceptor.log(DefaultInterceptor.java:36)
>         at sun.reflect.GeneratedMethodAccessor150.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:585)
>         at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:118)
>         at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
>         at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
>         at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:106)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:278)
>         at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
>         at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
>         at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:734)
>         at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:560)
>         at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:369)
>         at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:165)
> 10:56:52,804 ERROR [GenericHibernateCrudDAO] Hibernate Exception
> org.hibernate.TransactionException: Could not register synchronization for container transaction
>         at org.hibernate.transaction.CMTTransaction.begin(CMTTransaction.java:45)
>         at org.hibernate.ejb.transaction.JoinableCMTTransaction.begin(JoinableCMTTransaction.java:70)
>         at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
>         at com.dolby.persist.listener.trigger.AuditTrigger.audit(AuditTrigger.java:67)
>         at com.dolby.persist.listener.trigger.AuditTrigger.fireAfterUpdateTrigger(AuditTrigger.java:293)
>         at com.dolby.persist.listener.trigger.TriggerEventListener.onPostUpdate(TriggerEventListener.java:522)
>         at org.hibernate.action.EntityUpdateAction.postUpdate(EntityUpdateAction.java:180)
>         at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:159)
>         at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
>         at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
>         at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
>         at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
>         at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:41)
>         at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:969)
>         at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1562)
>         at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
>         at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:305)
>         at com.dolby.persist.dao.hibernate.GenericHibernateFinderDAO.findById(GenericHibernateFinderDAO.java:250)
>         at com.dolby.persist.dao.hibernate.GenericHibernateCrudDAO.merge(GenericHibernateCrudDAO.java:112)
>         at com.dolby.pics.core.ejb.bean.impl.InventoryBean.save(InventoryBean.java:99)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:585)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
>         at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
>         at com.dolby.pics.core.ejb.bean.impl.DefaultInterceptor.log(DefaultInterceptor.java:36)
>         at sun.reflect.GeneratedMethodAccessor150.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:585)
>         at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:118)
>         at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
>         at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
>         at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:106)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:278)
>         at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
>         at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
>         at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:734)
>         at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:560)
>         at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:369)
>         at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:165)
> 10:56:52,823 ERROR [DefaultInterceptor] An error occured executing: com.dolby.pics.core.ejb.bean.impl.InventoryBean.save([Ljava.lang.Object;@5c96bfda)
> com.dolby.pics.core.ejb.SaveFailedException: Could not register synchronization for container transaction
>         at com.dolby.pics.core.ejb.bean.impl.InventoryBean.save(InventoryBean.java:113)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:585)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
>         at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
>         at com.dolby.pics.core.ejb.bean.impl.DefaultInterceptor.log(DefaultInterceptor.java:36)
>         at sun.reflect.GeneratedMethodAccessor150.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:585)
>         at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:118)
>         at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
>         at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
>         at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:106)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
>         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
>         at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:278)
>         at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
>         at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
>         at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:734)
>         at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:560)
>         at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:369)
>         at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:165)
> 		

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list