-
15. Re: Double updates with CMR fields
wolfc Sep 17, 2003 7:11 AM (in response to sblaes)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 Sep 17, 2003 12:06 PM (in response to 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 Sep 17, 2003 12:36 PM (in response to sblaes)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 Sep 18, 2003 3:11 AM (in response to sblaes)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 Sep 18, 2003 9:19 AM (in response to 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 Sep 18, 2003 9:37 AM (in response to 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 Sep 18, 2003 12:59 PM (in response to sblaes)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 Sep 18, 2003 2:24 PM (in response to sblaes)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 Sep 22, 2003 3:05 AM (in response to sblaes)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 Sep 22, 2003 10:48 AM (in response to 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 Sep 23, 2003 2:46 AM (in response to sblaes)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 Sep 24, 2003 10:08 AM (in response to sblaes)I'll give that a shot.
-
27. Re: Double updates with CMR fields
sblaes Sep 29, 2003 5:17 PM (in response to 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 Sep 29, 2003 5:24 PM (in response to 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 Sep 30, 2003 5:59 AM (in response to sblaes)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.