I can't understand why I'm getting a StaleObjectStateException in my action. Or 
rather, I understand why, but I don't understand why the entity is not up to 
date.

This is a simplified version of my action:


  |     @In(create = true)
  |     EntityManager database;
  | 
  |     @In
  |     @Out
  |     private User loggedInUser; //created by Authenticator
  | 
  |     @DataModel
  |     private List<ListBidItem> listBidItems = new ArrayList<ListBidItem>();
  | 
  |     @Begin(join = true)
  |     public void addBidItem(ActionEvent event){
  |         ListBidItem newItem = new ListBidItem();
  |         listBidItems.add(newItem);
  |     }
  | 
  |     @End
  |     public void yesConfirmSave() {
  |         confirming = false;
  |         //database.refresh(loggedInUser); //doesn't seem to help
  |         Date now = new Date();
  |         Bid bid = new Bid();
  |         bid.setCreatedOn(now);
  |         bid.setCreatedBy(loggedInUser);
  |         bid.setBidder((Bidder) loggedInUser);
  |         ((Bidder) loggedInUser).setBid(bid);
  | 
  |         for (ListBidItem lbi: listBidItems) {
  |             BidItem bi = lbi.getBidItem();
  |             bi.setCreatedBy(loggedInUser);
  |             bi.setCreatedOn(now);
  |             bi.setBid(bid);
  |             bid.getBidItems().add(bi);
  |         }
  |         database.persist(bid);
  |         loggedInUser = bookBuildingDatabase.merge(loggedInUser);
  |     }
  | 

pages.xml is simple:

  |     <page view-id="/restricted/createBid.xhtml">
  |         <restrict>#{s:hasRole('Bidder')}</restrict>
  |         <navigation from-action="#{bidderBidManager.yesConfirmSave}">
  |             <end-conversation/>
  |             <redirect view-id="/restricted/createBid.xhtml"/>
  |         </navigation>
  |     </page>
  | 

The User entity has a property:


  |     @Version
  |     @Column(name="VERSION")
  |     protected int version;
  | 

Now, when yesConfirmSave is called the first time after log in, everything 
works fine. When the user trues to save a second Bid, however, the 
StaleObjectStateException is thrown. From debugging the addition of the second 
bid, I can see that the the loggedInUser's Bid is correctly set, but the 
version number is not up to date. Adding the database.refresh() call does not 
seem to help either.

(I know the use case does not make sense, seeing as a user can only have one 
bid, but please disregard that :) )

Thanks


Here's the stack trace:

  | [2007-03-06 18:20:25,781] ERROR 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/TTS-BookBuilding].[Blocking
 Servlet] Servlet.service() for servlet Blocking Servlet threw exception 
  | javax.faces.FacesException: Error calling action method of component with 
id bidForm:_id64
  |     at 
org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:74)
  |     at javax.faces.component.UICommand.broadcast(UICommand.java:106)
  |     at 
javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:94)
  |     at 
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:168)
  |     at 
org.apache.myfaces.lifecycle.LifecycleImpl.invokeApplication(LifecycleImpl.java:343)
  |     at 
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:86)
  |     at 
com.icesoft.faces.webapp.xmlhttp.BlockingServlet.renderCyclePartial(BlockingServlet.java:473)
  |     at 
com.icesoft.faces.webapp.xmlhttp.BlockingServlet.receiveUpdates(BlockingServlet.java:442)
  |     at 
com.icesoft.faces.webapp.xmlhttp.BlockingServlet.executeRequest(BlockingServlet.java:324)
  |     at 
com.icesoft.faces.webapp.xmlhttp.BlockingServlet.service(BlockingServlet.java:186)
  |     at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
  |     at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
  |     at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  |     at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
  |     at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
  |     at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
  |     at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
  |     at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
  |     at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
  |     at 
org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:833)
  |     at 
org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:639)
  |     at 
org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1285)
  |     at java.lang.Thread.run(Thread.java:595)
  | Caused by: javax.faces.el.EvaluationException: /restricted/createBid.xhtml 
@90,154 action="#{bidderBidManager.yesConfirmSave}": javax.ejb.EJBException: 
javax.persistence.OptimisticLockException: 
org.hibernate.StaleObjectStateException: Row was updated or deleted by another 
transaction (or unsaved-value mapping was incorrect): 
[com.ttsme.bb.entities.Bidder#<null>]
  |     at 
com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java:73)
  |     at 
org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:63)
  |     ... 22 more
  | Caused by: javax.ejb.EJBException: 
javax.persistence.OptimisticLockException: 
org.hibernate.StaleObjectStateException: Row was updated or deleted by another 
transaction (or unsaved-value mapping was incorrect): 
[com.ttsme.bb.entities.Bidder#<null>]
  |     at 
org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:69)
  |     at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
  |     at 
org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:197)
  |     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.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:81)
  |     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |     at 
org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
  |     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |     at 
org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
  |     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.stateful.StatefulContainer.localInvoke(StatefulContainer.java:189)
  |     at 
org.jboss.ejb3.stateful.StatefulLocalProxy.invoke(StatefulLocalProxy.java:98)
  |     at $Proxy66.yesConfirmSave(Unknown Source)
  |     at 
com.ttsme.bb.actions.BidderBidManagerLocal$$FastClassByCGLIB$$9b740d18.invoke(<generated>)
  |     at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
  |     at 
org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:45)
  |     at 
org.jboss.seam.intercept.ClientSideInterceptor$1.proceed(ClientSideInterceptor.java:74)
  |     at 
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:57)
  |     at 
org.jboss.seam.interceptors.SecurityInterceptor.aroundInvoke(SecurityInterceptor.java:37)
  |     at 
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
  |     at 
org.jboss.seam.interceptors.RemoveInterceptor.aroundInvoke(RemoveInterceptor.java:40)
  |     at 
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
  |     at 
org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:103)
  |     at 
org.jboss.seam.intercept.ClientSideInterceptor.intercept(ClientSideInterceptor.java:52)
  |     at 
org.jboss.seam.intercept.Proxy$$EnhancerByCGLIB$$e48e6e3d.yesConfirmSave(<generated>)
  |     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 com.sun.el.parser.AstValue.invoke(AstValue.java:151)
  |     at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:283)
  |     at 
com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
  |     at 
com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java:69)
  |     ... 23 more
  | Caused by: javax.persistence.OptimisticLockException: 
org.hibernate.StaleObjectStateException: Row was updated or deleted by another 
transaction (or unsaved-value mapping was incorrect): 
[com.ttsme.bb.entities.Bidder#<null>]
  |     at 
org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:551)
  |     at 
org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:210)
  |     at 
org.jboss.seam.persistence.EntityManagerProxy.merge(EntityManagerProxy.java:121)
  |     at 
com.ttsme.bb.actions.BidderBidManager.yesConfirmSave(BidderBidManager.java:102)
  |     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 
org.jboss.seam.intercept.EJBInvocationContext.proceed(EJBInvocationContext.java:37)
  |     at 
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:57)
  |     at 
org.jboss.seam.interceptors.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:47)
  |     at 
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
  |     at 
org.jboss.seam.interceptors.ManagedEntityIdentityInterceptor.aroundInvoke(ManagedEntityIdentityInterceptor.java:37)
  |     at 
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
  |     at 
org.jboss.seam.interceptors.ConversationInterceptor.aroundInvoke(ConversationInterceptor.java:54)
  |     at 
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
  |     at 
org.jboss.seam.interceptors.BusinessProcessInterceptor.aroundInvoke(BusinessProcessInterceptor.java:51)
  |     at 
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
  |     at 
org.jboss.seam.interceptors.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:27)
  |     at 
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
  |     at 
org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:103)
  |     at 
org.jboss.seam.intercept.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:53)
  |     at sun.reflect.GeneratedMethodAccessor333.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.ExtendedPersistenceContextPropagationInterceptor.invoke(ExtendedPersistenceContextPropagationInterceptor.java:57)
  |     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)
  |     ... 58 more
  | Caused by: org.hibernate.StaleObjectStateException: Row was updated or 
deleted by another transaction (or unsaved-value mapping was incorrect): 
[com.ttsme.bb.entities.Bidder#<null>]
  |     at 
org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:240)
  |     at 
org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:99)
  |     at 
org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:51)
  |     at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:679)
  |     at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:663)
  |     at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:667)
  |     at 
org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:201)
  |     ... 93 more
  | 

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4025404#4025404

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4025404
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to