When investigating this further I found out the following:

This is a normal call stack (as printed from the AbstractInstanceCache.insert 
method) when creating new instance of entity bean (CustomerBean) with empty 
ejbPostCreate() method. As you can see the insertion into cache happens after 
the ejbPostCreate method returns...

[16:16:32,939,Default] TRACE: CustomerBean.ejbCreate... id=peter
[16:16:33,035,Default] TRACE: CustomerBean.ejbPostCreate... id=peter
[16:16:33,085,Default] java.lang.Exception: JUST DUMPING STACK, key = peter
[16:16:33,086,Default]  at 
org.jboss.ejb.plugins.AbstractInstanceCache.insert(AbstractInstanceCache.java:242)
[16:16:33,087,Default]  at 
org.jboss.ejb.plugins.EntityInstanceInterceptor.invokeHome(EntityInstanceInterceptor.java:164)
[16:16:33,088,Default]  at 
org.jboss.ejb.plugins.EntityLockInterceptor.invokeHome(EntityLockInterceptor.java:104)
[16:16:33,089,Default]  at 
org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:100)
[16:16:33,090,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:156)
[16:16:33,091,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.invokeHome(TxInterceptorCMT.java:56)
[16:16:33,091,Default]  at 
org.jboss.ejb.plugins.SecurityInterceptor.invokeHome(SecurityInterceptor.java:106)
[16:16:33,092,Default]  at 
org.jboss.ejb.plugins.LogInterceptor.invokeHome(LogInterceptor.java:109)
[16:16:33,093,Default]  at 
org.jboss.ejb.EntityContainer.invokeHome(EntityContainer.java:441)
[16:16:33,094,Default]  at 
org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker.invokeHome(JRMPContainerInvoker.java:421)
[16:16:33,099,Default]  at 
org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy.invokeHome(HomeProxy.java:237)
[16:16:33,100,Default]  at 
org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy.invoke(HomeProxy.java:182)
[16:16:33,101,Default]  at $Proxy9.create(Unknown Source)
[16:16:33,102,Default]  at 
_0002fcreateCustomer_0002ejspcreateCustomer_jsp_0._jspService(_0002fcreateCustomer_0002ejspcreateCustomer_jsp_0.java:90)


...and these are two call stacks of the same situation when creating a new 
instance of entity bean (AddressBean) which in it's ejbPostCreate() method 
calls related entity's (CustomerBean) bussiness method that in turn adds the 
just created instance (of AddressBean) to the -to-many side of the 
one-to-many relation. As you can see the 1st insert happens as a result of 
the calling of the bussines method in the ejbPostCreate()...


[16:21:34,218,Default] TRACE: AddressBean.ejbCreate... cid=peter, 
id=peter_home
[16:21:34,263,Default] TRACE: AddressBean.ejbPostCreate... begin cid=peter, 
id=peter_home
[16:21:34,305,Default] java.lang.Exception: JUST DUMPING STACK, key = 
peter_home
[16:21:34,306,Default]  at 
org.jboss.ejb.plugins.AbstractInstanceCache.insert(AbstractInstanceCache.java:242)
[16:21:34,307,Default]  at 
org.jboss.ejb.plugins.AbstractInstanceCache.get(AbstractInstanceCache.java:208)
[16:21:34,308,Default]  at 
org.jboss.ejb.plugins.EntityInstanceCache.get(EntityInstanceCache.java:60)
[16:21:34,309,Default]  at 
org.jboss.ejb.plugins.EntityInstanceInterceptor.invoke(EntityInstanceInterceptor.java:185)
[16:21:34,310,Default]  at 
org.jboss.ejb.plugins.EntityLockInterceptor.invoke(EntityLockInterceptor.java:132)
[16:21:34,311,Default]  at 
org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:98)
[16:21:34,312,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:156)
[16:21:34,313,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:65)
[16:21:34,313,Default]  at 
org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:131)
[16:21:34,314,Default]  at 
org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:166)
[16:21:34,315,Default]  at 
org.jboss.ejb.EntityContainer.invoke(EntityContainer.java:447)
[16:21:34,316,Default]  at 
org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMRFieldBridge.invokeGetRelatedId(JDBCCMRFieldBridge.java:471)
[16:21:34,317,Default]  at 
org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMRFieldBridge.createRelationLinks(JDBCCMRFieldBridge.java:430)
[16:21:34,318,Default]  at 
org.jboss.ejb.plugins.cmp.jdbc.bridge.RelationSet.add(RelationSet.java:82)
[16:21:34,318,Default]  at 
customer.CustomerBean.addAddress(CustomerBean.java:109)
[16:21:34,319,Default]  at java.lang.reflect.Method.invoke(Native Method)
[16:21:34,321,Default]  at 
org.jboss.ejb.EntityContainer$ContainerInterceptor.invoke(EntityContainer.java:1002)
[16:21:34,322,Default]  at 
org.jboss.ejb.plugins.cmp.jdbc.JDBCReadAheadInterceptor.invoke(JDBCReadAheadInterceptor.java:100)
[16:21:34,323,Default]  at 
org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor.invoke(JDBCRelationInterceptor.java:134)
[16:21:34,324,Default]  at 
org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invoke(EntitySynchronizationInterceptor.java:308)
[16:21:34,325,Default]  at 
org.jboss.ejb.plugins.EntityInstanceInterceptor.invoke(EntityInstanceInterceptor.java:201)
[16:21:34,325,Default]  at 
org.jboss.ejb.plugins.EntityLockInterceptor.invoke(EntityLockInterceptor.java:132)
[16:21:34,326,Default]  at 
org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:98)
[16:21:34,327,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:156)
[16:21:34,328,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:65)
[16:21:34,329,Default]  at 
org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:131)
[16:21:34,330,Default]  at 
org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:166)
[16:21:34,331,Default]  at 
org.jboss.ejb.EntityContainer.invoke(EntityContainer.java:447)
[16:21:34,331,Default]  at 
org.jboss.ejb.plugins.local.BaseLocalContainerInvoker.invoke(BaseLocalContainerInvoker.java:320)
[16:21:34,332,Default]  at 
org.jboss.ejb.plugins.local.BaseLocalContainerInvoker$EntityProxy.invoke(BaseLocalContainerInvoker.java:449)
[16:21:34,333,Default]  at $Proxy11.addAddress(Unknown Source)
[16:21:34,334,Default]  at 
customer.AddressBean.postCreate(AddressBean.java:112)
[16:21:34,335,Default]  at 
customer.AddressBean.ejbPostCreate(AddressBean.java:101)
[16:21:34,336,Default]  at java.lang.reflect.Method.invoke(Native Method)
[16:21:34,336,Default]  at 
org.jboss.ejb.plugins.CMPPersistenceManager.createEntity(CMPPersistenceManager.java:239)
[16:21:34,337,Default]  at 
org.jboss.ejb.EntityContainer.createHome(EntityContainer.java:673)
[16:21:34,338,Default]  at java.lang.reflect.Method.invoke(Native Method)
[16:21:34,339,Default]  at 
org.jboss.ejb.EntityContainer$ContainerInterceptor.invokeHome(EntityContainer.java:926)
[16:21:34,340,Default]  at 
org.jboss.ejb.plugins.AbstractInterceptor.invokeHome(AbstractInterceptor.java:74)
[16:21:34,341,Default]  at 
org.jboss.ejb.plugins.AbstractInterceptor.invokeHome(AbstractInterceptor.java:74)
[16:21:34,342,Default]  at 
org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invokeHome(EntitySynchronizationInterceptor.java:234)
[16:21:34,343,Default]  at 
org.jboss.ejb.plugins.EntityInstanceInterceptor.invokeHome(EntityInstanceInterceptor.java:151)
[16:21:34,343,Default]  at 
org.jboss.ejb.plugins.EntityLockInterceptor.invokeHome(EntityLockInterceptor.java:104)
[16:21:34,344,Default]  at 
org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:100)
[16:21:34,345,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:156)
[16:21:34,346,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.invokeHome(TxInterceptorCMT.java:56)
[16:21:34,347,Default]  at 
org.jboss.ejb.plugins.SecurityInterceptor.invokeHome(SecurityInterceptor.java:106)
[16:21:34,348,Default]  at 
org.jboss.ejb.plugins.LogInterceptor.invokeHome(LogInterceptor.java:109)
[16:21:34,348,Default]  at 
org.jboss.ejb.EntityContainer.invokeHome(EntityContainer.java:441)
[16:21:34,349,Default]  at 
org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker.invokeHome(JRMPContainerInvoker.java:421)
[16:21:34,352,Default]  at 
org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy.invokeHome(HomeProxy.java:237)
[16:21:34,353,Default]  at 
org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy.invoke(HomeProxy.java:182)
[16:21:34,354,Default]  at $Proxy13.create(Unknown Source)
[16:21:34,355,Default]  at 
_0002feditCustomer_0002ejspeditCustomer_jsp_0._jspService(_0002feditCustomer_0002ejspeditCustomer_jsp_0.java:141)


... and the 2nd attempt to insert the same context into cache is after the 
return from the ejbPostCreate()...


[16:21:34,405,Default] TRACE: AddressBean.ejbPostCreate... end cid=peter, 
id=peter_home
[16:21:34,406,Default] java.lang.Exception: JUST DUMPING STACK, key = 
peter_home
[16:21:34,407,Default]  at 
org.jboss.ejb.plugins.AbstractInstanceCache.insert(AbstractInstanceCache.java:242)
[16:21:34,408,Default]  at 
org.jboss.ejb.plugins.EntityInstanceInterceptor.invokeHome(EntityInstanceInterceptor.java:164)
[16:21:34,409,Default]  at 
org.jboss.ejb.plugins.EntityLockInterceptor.invokeHome(EntityLockInterceptor.java:104)
[16:21:34,410,Default]  at 
org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:100)
[16:21:34,411,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:156)
[16:21:34,412,Default]  at 
org.jboss.ejb.plugins.TxInterceptorCMT.invokeHome(TxInterceptorCMT.java:56)
[16:21:34,412,Default]  at 
org.jboss.ejb.plugins.SecurityInterceptor.invokeHome(SecurityInterceptor.java:106)
[16:21:34,413,Default]  at 
org.jboss.ejb.plugins.LogInterceptor.invokeHome(LogInterceptor.java:109)
[16:21:34,414,Default]  at 
org.jboss.ejb.EntityContainer.invokeHome(EntityContainer.java:441)
[16:21:34,415,Default]  at 
org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker.invokeHome(JRMPContainerInvoker.java:421)
[16:21:34,416,Default]  at 
org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy.invokeHome(HomeProxy.java:237)
[16:21:34,417,Default]  at 
org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy.invoke(HomeProxy.java:182)
[16:21:34,417,Default]  at $Proxy13.create(Unknown Source)
[16:21:34,418,Default]  at 
_0002feditCustomer_0002ejspeditCustomer_jsp_0._jspService(_0002feditCustomer_0002ejspeditCustomer_jsp_0.java:141)


My feeling is that the context should be inserted into cache between the 
return from the ejbCreate() and the call to ejbPostCreate() method. As soon 
as the identity of the instance is established. This way the calls to 
business methods in ejbPostCreate() will get an already cached context via 
AbstractInstanceCache.get() and this method (AbstractInstanceCache.get()) 
will not blindly acquireContext(), set it's id, activate it and so on... only 
to later, when time has come to insert the created context, find out that 
some other context with same id has already been inserted...

This is my ignorant understanding of the matter (I have just downloaded the 
sources and began to study the EJB specs a few days ago)...

Peter

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to