1 2 3 Previous Next 30 Replies Latest reply on Oct 6, 2003 7:05 AM by wolfc Go to original post
      • 15. Re: Double updates with CMR fields
        wolfc

        Ah cool, already another patch has been submitted & applied to branch 3.2.

        http://sourceforge.net/tracker/index.php?func=detail&aid=735715&group_id=22866&atid=376687

        Hmm, now I'm stumped because the bug report (699938) states that it's going wrong in RC2 & RC3.

        • 16. Re: Double updates with CMR fields
          sblaes

          If this may not be the same issue, is there anything I can do to help debug it?

          • 17. Re: Double updates with CMR fields
            wolfc

            Sure, can you check whether it works in RC1?
            I'm trying to reproduce in RC3, but a lot of extra checks have been implemented so I need to iron my own application first. :-)
            Somewhere between 3.2.1 & 3.2.2RC3 the whole JDBC bridge has been rewritten for performance, maybe that reintroduced the bug.
            I already saw that the approach Alex took for fixing this bug is very different than my own. He's not flagging it as dirty when instance is set, I'm cleaning it up afterwards in the setClean.

            • 18. Re: Double updates with CMR fields
              wolfc

              For reference:
              http://sourceforge.net/tracker/?func=detail&aid=699938&group_id=22866&atid=376685

              I can't reproduce this in RC3!?
              Ah well, it's always fun to dig around some code.

              • 19. Re: Double updates with CMR fields
                sblaes

                I think I understand where there may be some confusion. I'm using xdoclet to generate value objects. When I update using these value objects, the generated code calls the setters on all of the CMP and CMR fields. In my opinion, I think they should check the values before they update them, and not try to update them if they've not changed, but that's irrellevant to this discussion...

                Anyway, I understand that JBoss will think that all fields have been updated, and are in fact dirty. However, it's calling two queries to update the database. I believe one is for the standard CMP fields, and another to update the CMR field. The trace from my logs follow, which may or may not help:

                10:16:14,222 DEBUG [findByPrimaryKey] Executing SQL: SELECT ccat_pkid FROM CONTAINER_CATALOG WHERE ccat_pkid=?
                10:16:14,232 DEBUG [ContainerCatalogEntryEntity] Executing SQL: SELECT ccat_name, ccat_code, ccat_is_standard, ccat_description, ccat_oracle_prod_code, ccat_size, last_mod_type, last_mod_user, last_mod_app, last_mod_date, last_mod_comment, CTYPE_PKID FROM CONTAINER_CATALOG WHERE (ccat_pkid=?)
                10:16:14,252 DEBUG [ContainerCatalogEntryEntity] Executing SQL: UPDATE CONTAINER_CATALOG SET ccat_name=?, ccat_description=?, ccat_oracle_prod_code=?, last_mod_date=?, last_mod_comment=? WHERE ccat_pkid=?
                10:16:14,262 DEBUG [ContainerCatalogEntryEntity] Rows affected = 1
                10:16:14,262 DEBUG [findByPrimaryKey] Executing SQL: SELECT ctype_pkid FROM CONTAINER_TYPE WHERE ctype_pkid=?
                10:16:14,302 DEBUG [ContainerTypeEntity] Executing SQL: SELECT ctype_code, ctype_name, ctype_desc, last_mod_type, last_mod_user, last_mod_app, last_mod_date, last_mod_comment FROM CONTAINER_TYPE WHERE (ctype_pkid=?)
                10:16:14,312 DEBUG [ContainerCatalogEntryEntity] Executing SQL: UPDATE CONTAINER_CATALOG SET CTYPE_PKID=? WHERE ccat_pkid=?
                10:16:14,312 DEBUG [ContainerCatalogEntryEntity] Rows affected = 1
                10:16:14,352 DEBUG [findAll] Executing SQL: SELECT t0_o.ccat_pkid FROM CONTAINER_CATALOG t0_o


                Does this clear things up or is that what you understood was going on all along? I'm testing 3.2.1 and 3.2.2 RC1 now...

                • 20. Re: Double updates with CMR fields
                  sblaes

                  As near as I can tell, the behavior is the same in 3.2.1 and all candidates for 3.2.2

                  • 21. Re: Double updates with CMR fields
                    aloubyansky

                    Any kind of column duplications in SELECTs and UPDATEs should now be fixed in current Branch_3_2, which is 3.2.2RC4. If you meet problems, please, open a bug report. Thanks!

                    • 22. Re: Double updates with CMR fields
                      schmidts

                      Just switched from 3.2.2RC3 to RC4 and my entity beans no longer deploy because of a NullPointerException in JDBCCMRFieldBridge.java, line 1399.

                      Note that I'm using optimistic timestamp locking on all entity beans. It seems that the automatically added timestamp column does not have the expected metadata, hence the NullPointerException.
                      Here's an excerpt from the stack trace:

                      2003-09-18 22:19:15,265 ERROR [org.jboss.ejb.EntityContainer] Starting failed
                      java.lang.NullPointerException
                      at org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMRFieldBridge.initializeForeignKeyFields(JDBCCMRFieldBridge.java:1399)
                      at org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMRFieldBridge.resolveRelationship(JDBCCMRFieldBridge.java:293)
                      at org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCEntityBridge.resolveRelationships(JDBCEntityBridge.java:223)
                      at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.resolveRelationships(JDBCStoreManager.java:468)
                      at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.start(JDBCStoreManager.java:393)
                      at org.jboss.ejb.plugins.CMPPersistenceManager.start(CMPPersistenceManager.java:152)
                      at org.jboss.ejb.EntityContainer.startService(EntityContainer.java:343)
                      at org.jboss.system.ServiceMBeanSupport.start(ServiceMBeanSupport.java:192)

                      • 23. Re: Double updates with CMR fields
                        wolfc

                        Hmm, that doesn't happen in my code, here's a (moderated) trace:

                        2003-09-18 11:09:03,330 DEBUG [org.jboss.ejb.plugins.cmp.jdbc.JDBCFindByPrimaryKeyQuery.Ticket.findByPrimaryKey] Executing SQL: SELECT ticket_num FROM ticket WHERE ticket_num=?
                        2003-09-18 11:09:11,596 DEBUG [org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.Ticket] Executing SQL: SELECT event_num, client_num, auditorium_num, section_num, row_num, seat_num_from, seat_num_to, seat_count, day, time, sms_text, grand_total, purchase_date, payment_type_num, pay_control, payment_result, ticket_string, bar_code_bmp, price_total, payment_cost, payment_type_num, event_num, client_num FROM ticket WHERE (ticket_num=?)
                        2003-09-18 11:09:34,785 DEBUG [org.jboss.ejb.plugins.cmp.jdbc.JDBCFindByPrimaryKeyQuery.PaymentType.findByPrimaryKey] Executing SQL: SELECT payment_type_num FROM payment_type WHERE payment_type_num=?
                        2003-09-18 11:09:42,864 DEBUG [org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.PaymentType] Executing SQL: SELECT description, fixed, minimum, method, minimum, percentage, pay_prov_num, pay_prov_num FROM payment_type WHERE (payment_type_num=?)
                        2003-09-18 11:09:54,146 TRACE [org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreEntityCommand.PaymentType] Store command NOT executed. Entity is not dirty: pk=5
                        2003-09-18 11:10:04,178 TRACE [org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreEntityCommand.Ticket] Store command NOT executed. Entity is not dirty: pk=4153

                        Could you tell me more about how you get generated code for setting the attributes of a value object into the entity and vica versa? (I currently do it via reflection).

                        • 24. Re: Double updates with CMR fields
                          sblaes

                          I'm still getting the same behavior in RC4.

                          I used xdoclet to generate the value objects for my cmp bean. The following is an excert from the generated method that is used to update an entity bean:

                          try
                          {
                          setName( valueHolder.getName() );
                          setCode( valueHolder.getCode() );
                          setIsStandardContainer( valueHolder.getIsStandardContainer() );
                          setDescription( valueHolder.getDescription() );
                          setOracleProductCode( valueHolder.getOracleProductCode() );
                          setSize( valueHolder.getSize() );
                          setModificationType( valueHolder.getModificationType() );
                          setLastModifiedUser( valueHolder.getLastModifiedUser() );
                          setLastModifiedApp( valueHolder.getLastModifiedApp() );
                          setLastModifiedDate( valueHolder.getLastModifiedDate() );
                          setLastModifiedComment( valueHolder.getLastModifiedComment() );

                          {
                          // Checks for null aggregate
                          if (valueHolder.getContainerTypeEntityLightValue() != null)
                          {
                          java.lang.Integer pk = valueHolder.getContainerTypeEntityLightValue().getKey();

                          com.crlcorp.tls.studysetup.container.entity.interfaces.ContainerTypeEntityHome home = com.crlcorp.tls.studysetup.container.entity.ContainerTypeEntityUtil.getLocalHome();

                          com.crlcorp.tls.studysetup.container.entity.interfaces.ContainerTypeEntity relation = home.findByPrimaryKey(pk);
                          setType(relation);
                          } else {
                          setType(null);
                          }
                          }
                          }
                          catch (Exception e)
                          {
                          throw new javax.ejb.EJBException(e);
                          }


                          • 25. Re: Double updates with CMR fields
                            wolfc

                            Okay I got the CMP code generation working, but I don't like the code at all. There are still too many bugs in it to be effective.

                            Back to the original problem: it appears that we're both working on the same problem, but I can't reproduce it in RC3. Maybe you can try to enable TRACE logging to see what happens? Or maybe a stack trace in ejbStore would provide some insight?

                            • 26. Re: Double updates with CMR fields
                              sblaes

                              I'll give that a shot.

                              • 27. Re: Double updates with CMR fields
                                sblaes

                                I have some more information. For some reason, I wasn't able to get log4j to run trace logging, but I downloaded the jboss source and I think I figured out what's going on. The xdoclet value objects first set all non-cmr fields in the entity. Then, they find the entity for the related object, at which point it appears that JBoss runs the UPDATE query. This occurs when EntityContainer.synchronizeEntitiesWithinTransaction is called from within findLocal.

                                Then, after the new finder is retrieved, the entity's CMR field is updated, which causes another UPDATE call to the database.

                                To make a long story short, it seems that JBoss pushes entity updates to the database when a finder is called after the updates have already been done within a transaction. Is that intentional behavior?

                                Here's a simplified version of the code that xdoclet is generating:

                                public void setContainerValue( ContainerValue valueHolder )
                                {

                                try
                                {
                                setName( valueHolder.getName() );
                                setDescription( valueHolder.getDescription() );

                                {
                                // Checks for null aggregate
                                if (valueHolder.getContainerTypeValue() != null)
                                {
                                Integer pk = valueHolder.getContainerTypeValue().getKey();

                                ContainerTypeEntityHome home = ContainerTypeEntityUtil.getLocalHome();

                                ContainerTypeEntity relation = home.findByPrimaryKey(pk);
                                setType(relation);
                                } else {
                                setType(null);
                                }
                                }
                                }
                                catch (Exception e)
                                {
                                throw new javax.ejb.EJBException(e);
                                }
                                }

                                • 28. Re: Double updates with CMR fields
                                  sblaes

                                  I'm running RC4. Here's a stack trace of the first update call:

                                  Thread [Thread-6] (Suspended (breakpoint at line 78 in JDBCStoreEntityCommand))
                                  JDBCStoreEntityCommand.execute(EntityEnterpriseContext) line: 78
                                  JDBCStoreManager.storeEntity(EntityEnterpriseContext) line: 649
                                  CMPPersistenceManager.storeEntity(EntityEnterpriseContext) line: 421
                                  CachedConnectionInterceptor.storeEntity(EntityEnterpriseContext) line: 387
                                  EntityContainer.storeEntity(EntityEnterpriseContext) line: 713
                                  GlobalTxEntityMap.synchronizeEntities(Transaction) line: 149
                                  EntityContainer.synchronizeEntitiesWithinTransaction(Transaction) line: 120
                                  EntityContainer.findLocal(Invocation) line: 606
                                  GeneratedMethodAccessor107.invoke(Object, Object[]) line: not available
                                  DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
                                  Method.invoke(Object, Object[]) line: 324
                                  EntityContainer$ContainerInterceptor.invokeHome(Invocation) line: 1042
                                  JDBCRelationInterceptor(AbstractInterceptor).invokeHome(Invocation) line: 88
                                  EntitySynchronizationInterceptor.invokeHome(Invocation) line: 185
                                  CachedConnectionInterceptor.invokeHome(Invocation) line: 214
                                  EntityReentranceInterceptor(AbstractInterceptor).invokeHome(Invocation) line: 88
                                  EntityInstanceInterceptor.invokeHome(Invocation) line: 91
                                  EntityLockInterceptor.invokeHome(Invocation) line: 61
                                  EntityCreationInterceptor.invokeHome(Invocation) line: 28
                                  TxInterceptorCMT(AbstractTxInterceptor).invokeNext(Invocation, boolean) line: 88
                                  TxInterceptorCMT.runWithTransactions(Invocation) line: 267
                                  TxInterceptorCMT.invokeHome(Invocation) line: 98
                                  SecurityInterceptor.invokeHome(Invocation) line: 92
                                  LogInterceptor.invokeHome(Invocation) line: 120
                                  ProxyFactoryFinderInterceptor.invokeHome(Invocation) line: 93
                                  EntityContainer.internalInvokeHome(Invocation) line: 484
                                  EntityContainer(Container).invoke(Invocation) line: 720
                                  BaseLocalProxyFactory.invokeHome(Method, Object[]) line: 293
                                  LocalHomeProxy.invoke(Object, Method, Object[]) line: 110
                                  $Proxy74.findByPrimaryKey(Integer) line: not available
                                  ContainerCatalogEntryEntityCMP$Proxy(ContainerCatalogEntryEntityCMP).setContainerCatalogEntryEntityValue(ContainerCatalogEntryEntityValue) line: 156
                                  NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
                                  NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 [local variables unavailable]
                                  DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 [local variables unavailable]
                                  Method.invoke(Object, Object[]) line: 324 [local variables unavailable]
                                  EntityContainer$ContainerInterceptor.invoke(Invocation) line: 1095
                                  JDBCRelationInterceptor.invoke(Invocation) line: 71
                                  EntitySynchronizationInterceptor.invoke(Invocation) line: 298
                                  CachedConnectionInterceptor.invoke(Invocation) line: 185
                                  EntityReentranceInterceptor.invoke(Invocation) line: 114
                                  EntityInstanceInterceptor.invoke(Invocation) line: 174
                                  EntityLockInterceptor.invoke(Invocation) line: 89
                                  EntityCreationInterceptor.invoke(Invocation) line: 53
                                  TxInterceptorCMT(AbstractTxInterceptor).invokeNext(Invocation, boolean) line: 84
                                  TxInterceptorCMT.runWithTransactions(Invocation) line: 267
                                  TxInterceptorCMT.invoke(Invocation) line: 128
                                  SecurityInterceptor.invoke(Invocation) line: 118
                                  LogInterceptor.invoke(Invocation) line: 191
                                  ProxyFactoryFinderInterceptor.invoke(Invocation) line: 122
                                  EntityContainer.internalInvoke(Invocation) line: 490
                                  EntityContainer(Container).invoke(Invocation) line: 700
                                  BaseLocalProxyFactory.invoke(Object, Method, Object[]) line: 375
                                  EntityProxy.invoke(Object, Method, Object[]) line: 38
                                  $Proxy95.setContainerCatalogEntryEntityValue(ContainerCatalogEntryEntityValue) line: not available [local variables unavailable]
                                  ContainerBeanFacadeSession(ContainerBeanFacade).updateContainerByPK(Integer, ContainerCatalogEntryEntityValue) line: 168
                                  NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
                                  NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 [local variables unavailable]
                                  DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 [local variables unavailable]
                                  Method.invoke(Object, Object[]) line: 324 [local variables unavailable]
                                  StatelessSessionContainer$ContainerInterceptor.invoke(Invocation) line: 683
                                  CachedConnectionInterceptor.invoke(Invocation) line: 185
                                  StatelessSessionInstanceInterceptor.invoke(Invocation) line: 72
                                  TxInterceptorCMT(AbstractTxInterceptor).invokeNext(Invocation, boolean) line: 84
                                  TxInterceptorCMT.runWithTransactions(Invocation) line: 267
                                  TxInterceptorCMT.invoke(Invocation) line: 128
                                  SecurityInterceptor.invoke(Invocation) line: 118
                                  LogInterceptor.invoke(Invocation) line: 191
                                  ProxyFactoryFinderInterceptor.invoke(Invocation) line: 122
                                  StatelessSessionContainer.internalInvoke(Invocation) line: 331
                                  StatelessSessionContainer(Container).invoke(Invocation) line: 700
                                  BaseLocalProxyFactory.invoke(Object, Method, Object[]) line: 375
                                  StatelessSessionProxy.invoke(Object, Method, Object[]) line: 83
                                  $Proxy158.updateContainerByPK(Integer, ContainerCatalogEntryEntityValue) line: not available [local variables unavailable]
                                  UpdateContainersAction.editContainer(ActionMapping, DynaActionForm, HttpServletRequest, HttpServletResponse) line: 72
                                  UpdateContainersAction.execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 42
                                  TilesRequestProcessor(RequestProcessor).processActionPerform(HttpServletRequest, HttpServletResponse, Action, ActionForm, ActionMapping) line: 484
                                  TilesRequestProcessor(RequestProcessor).process(HttpServletRequest, HttpServletResponse) line: 274
                                  ActionServlet.process(HttpServletRequest, HttpServletResponse) line: 1482
                                  ActionServlet.doPost(HttpServletRequest, HttpServletResponse) line: 525
                                  ActionServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 760
                                  ActionServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 853
                                  ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 247
                                  ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 193
                                  StandardWrapperValve.invoke(Request, Response, ValveContext) line: 256
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 643
                                  StandardPipeline.invoke(Request, Response) line: 480
                                  StandardWrapper(ContainerBase).invoke(Request, Response) line: 995
                                  StandardContextValve.invoke(Request, Response, ValveContext) line: 191
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 643
                                  JBossSecurityMgrRealm.invoke(Request, Response, ValveContext) line: 228
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  FormAuthenticator(AuthenticatorBase).invoke(Request, Response, ValveContext) line: 553
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  CertificatesValve.invoke(Request, Response, ValveContext) line: 246
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  ContainerStatsValve.invoke(Request, Response, ValveContext) line: 76
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  StandardPipeline.invoke(Request, Response) line: 480
                                  StandardContext(ContainerBase).invoke(Request, Response) line: 995
                                  StandardContext.invoke(Request, Response) line: 2416
                                  StandardHostValve.invoke(Request, Response, ValveContext) line: 180
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 643
                                  ErrorDispatcherValve.invoke(Request, Response, ValveContext) line: 171
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  ErrorReportValve.invoke(Request, Response, ValveContext) line: 172
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  SecurityAssociationValve.invoke(Request, Response, ValveContext) line: 65
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  AccessLogValve.invoke(Request, Response, ValveContext) line: 577
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  StandardPipeline.invoke(Request, Response) line: 480
                                  StandardHost(ContainerBase).invoke(Request, Response) line: 995
                                  StandardEngineValve.invoke(Request, Response, ValveContext) line: 174
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 643
                                  StandardPipeline.invoke(Request, Response) line: 480
                                  StandardEngine(ContainerBase).invoke(Request, Response) line: 995
                                  CoyoteAdapter.service(Request, Response) line: 223
                                  Http11Processor.process(InputStream, OutputStream) line: 601
                                  Http11Protocol$Http11ConnectionHandler.processConnection(TcpConnection, Object[]) line: 392
                                  TcpWorkerThread.runIt(Object[]) line: 565
                                  ThreadPool$ControlRunnable.run() line: 619
                                  ThreadWithAttributes(Thread).run() line: 534 [local variables unavailable]




                                  And the second update call:
                                  Thread [Thread-6] (Suspended (breakpoint at line 78 in JDBCStoreEntityCommand))
                                  JDBCStoreEntityCommand.execute(EntityEnterpriseContext) line: 78
                                  JDBCStoreManager.storeEntity(EntityEnterpriseContext) line: 649
                                  CMPPersistenceManager.storeEntity(EntityEnterpriseContext) line: 421
                                  CachedConnectionInterceptor.storeEntity(EntityEnterpriseContext) line: 387
                                  EntityContainer.storeEntity(EntityEnterpriseContext) line: 713
                                  GlobalTxEntityMap.synchronizeEntities(Transaction) line: 149
                                  GlobalTxEntityMap$GlobalTxEntityMapSynchronize.beforeCompletion() line: 215
                                  TransactionImpl.doBeforeCompletion() line: 1296
                                  TransactionImpl.commit() line: 342
                                  TxInterceptorCMT.endTransaction(Invocation, Transaction, Transaction) line: 398
                                  TxInterceptorCMT.runWithTransactions(Invocation) line: 277
                                  TxInterceptorCMT.invoke(Invocation) line: 128
                                  SecurityInterceptor.invoke(Invocation) line: 118
                                  LogInterceptor.invoke(Invocation) line: 191
                                  ProxyFactoryFinderInterceptor.invoke(Invocation) line: 122
                                  StatelessSessionContainer.internalInvoke(Invocation) line: 331
                                  StatelessSessionContainer(Container).invoke(Invocation) line: 700
                                  BaseLocalProxyFactory.invoke(Object, Method, Object[]) line: 375
                                  StatelessSessionProxy.invoke(Object, Method, Object[]) line: 83
                                  $Proxy158.updateContainerByPK(Integer, ContainerCatalogEntryEntityValue) line: not available [local variables unavailable]
                                  UpdateContainersAction.editContainer(ActionMapping, DynaActionForm, HttpServletRequest, HttpServletResponse) line: 72
                                  UpdateContainersAction.execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 42
                                  TilesRequestProcessor(RequestProcessor).processActionPerform(HttpServletRequest, HttpServletResponse, Action, ActionForm, ActionMapping) line: 484
                                  TilesRequestProcessor(RequestProcessor).process(HttpServletRequest, HttpServletResponse) line: 274
                                  ActionServlet.process(HttpServletRequest, HttpServletResponse) line: 1482
                                  ActionServlet.doPost(HttpServletRequest, HttpServletResponse) line: 525
                                  ActionServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 760
                                  ActionServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 853
                                  ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 247
                                  ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 193
                                  StandardWrapperValve.invoke(Request, Response, ValveContext) line: 256
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 643
                                  StandardPipeline.invoke(Request, Response) line: 480
                                  StandardWrapper(ContainerBase).invoke(Request, Response) line: 995
                                  StandardContextValve.invoke(Request, Response, ValveContext) line: 191
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 643
                                  JBossSecurityMgrRealm.invoke(Request, Response, ValveContext) line: 228
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  FormAuthenticator(AuthenticatorBase).invoke(Request, Response, ValveContext) line: 553
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  CertificatesValve.invoke(Request, Response, ValveContext) line: 246
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  ContainerStatsValve.invoke(Request, Response, ValveContext) line: 76
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  StandardPipeline.invoke(Request, Response) line: 480
                                  StandardContext(ContainerBase).invoke(Request, Response) line: 995
                                  StandardContext.invoke(Request, Response) line: 2416
                                  StandardHostValve.invoke(Request, Response, ValveContext) line: 180
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 643
                                  ErrorDispatcherValve.invoke(Request, Response, ValveContext) line: 171
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  ErrorReportValve.invoke(Request, Response, ValveContext) line: 172
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  SecurityAssociationValve.invoke(Request, Response, ValveContext) line: 65
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  AccessLogValve.invoke(Request, Response, ValveContext) line: 577
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 641
                                  StandardPipeline.invoke(Request, Response) line: 480
                                  StandardHost(ContainerBase).invoke(Request, Response) line: 995
                                  StandardEngineValve.invoke(Request, Response, ValveContext) line: 174
                                  StandardPipeline$StandardPipelineValveContext.invokeNext(Request, Response) line: 643
                                  StandardPipeline.invoke(Request, Response) line: 480
                                  StandardEngine(ContainerBase).invoke(Request, Response) line: 995
                                  CoyoteAdapter.service(Request, Response) line: 223
                                  Http11Processor.process(InputStream, OutputStream) line: 601
                                  Http11Protocol$Http11ConnectionHandler.processConnection(TcpConnection, Object[]) line: 392
                                  TcpWorkerThread.runIt(Object[]) line: 565
                                  ThreadPool$ControlRunnable.run() line: 619
                                  ThreadWithAttributes(Thread).run() line: 534 [local variables unavailable]

                                  • 29. Re: Double updates with CMR fields
                                    schmidts

                                    yes, modified in-memory copies of entities must be sent to the database before executing a finder, otherwise your in-memory copy might be inconsistent with the finder's result. AFAIR this behavior is defined in the EJB specification.