[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3094) StaleObjectStateException after removing two entities

Brill Pappin (JIRA) noreply at atlassian.com
Thu Nov 13 22:34:15 EST 2008


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3094?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=31709#action_31709 ] 

Brill Pappin commented on HHH-3094:
-----------------------------------

This issue is almost a year old...


> StaleObjectStateException after removing two entities
> -----------------------------------------------------
>
>                 Key: HHH-3094
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3094
>             Project: Hibernate Core
>          Issue Type: Bug
>    Affects Versions: 3.2.5
>         Environment: Hibernate EntityManager 3.3.1.GA
> Hibernate Annotations 3.3.0.GA
> Hibernate Core 3.2.5 
> Oracle 9.2.0.7.0
> Oracle JDBC driver 10.1.0.4.0
>            Reporter: ludki
>         Attachments: test.zip
>
>
> The szenrio is very simple : we have two entities EntityA, EntityB with a relation (EntityA.eB <-> EntityB.eA) between them.
> The foreign key 'eB_id' is located at the table of EntityA.
> The Lock-Strategy of both Entities is
> @org.hibernate.annotations.Entity(optimisticLock = org.hibernate.annotations.OptimisticLockType.DIRTY, dynamicUpdate = true)
> The initial state can be reached as follows:
> @PersistenceContext
> EntityManager m;
> public void create() {
>   EntityA a = new EntityA(1);    // PrimaryKey = 1
>   EntityB b = new EntityB(1);    // PrimaryKey = 1
>   a.eB = b;
>   b.eA = a;
>   m.persist(a);
>   m.persist(b);
> }
> in a new Transaction (or after a flush) we have first to release the relation between the two Entities and then remove them. For getting the Exception it is important to remove the Entity which contains the foreign key at last:
> private void remove() {
>   EntityA a = m.find(EntityA.class, 1);
>   EntityB b = m.find(EntityB.class, 1);
>  
>   m.remove(b);
>   m.remove(a);
> }
> A flush before the removes or switching the two removes will prevent the Exception.
> The generated (and obviously erroneous) SQL-Statements for the remove-method are listed below:
> update EntityA set eB_id=null where key=1 and eB_id=1
> delete from EntityB where key=1
> delete from EntityA where key=1 and eB_id = 1   <-- eB_id was set to null two lines ago, therefore the delete causes an EntityNotFoundException
> org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [test.EntityA#1]
> at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1765)
> at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2523)
> at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2697)
> at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:74)
> 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:146)
> at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
> at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
> at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
> at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
> at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:516)
> at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:114)
> at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:247)
> at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:86)
> at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
> at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1389)
> at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)
> at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
> at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
> at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
> 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:95)
> 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:110)
> 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:304)
> 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:769)
> at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573)
> at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373)
> at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166)
> javax.persistence.EntityNotFoundException: Unable to find test.EntityA with id 1
> at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:109)
> at org.hibernate.impl.SessionImpl.load(SessionImpl.java:797)
> at org.hibernate.ejb.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:640)
> at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:600)
> at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:525)
> at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:114)
> at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:247)
> at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:86)
> at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
> at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1389)
> at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)
> at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
> at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
> at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
> 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:95)
> 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:110)
> 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:304)
> 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:769)
> at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573)
> at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373)
> at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166)

-- 
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