Are you using one datacontext for the entire application?

Generally, you want one datacontext per user, or even one datacontext per 
request, depending on your use-case.

The exception is a "read-only" data context for data that doesn't typically 
change (lookup tables, for instance).

Robert

On Mar 12, 2012, at 3/126:10 AM , cghersi wrote:

> Update: I think I found the real source of the problem.
> 
> When I commit the just created object, I use the method 
> context.commitChanges() that saves ALL my persistent objects. If in another 
> thread I’m creating another persistent object in the meanwhile, such object 
> is saved with the partial information just added.
> 
> e.g.
> 
> in the first thread:
> 
> MyPerstObject1 newObj = context.get().newObject(MyPerstObject1.class);
> 
> newObj.setField1(“valueForField1”);
> 
> newObj.setField2(“valueForField2”);
> 
> newObj.setField3(“valueForField3”);
> 
> newObj.setField4(“valueForField4”);
> 
> context.commitChanges();
> 
> 
> 
> in another thread:
> 
> MyPerstObject2 newObj = context.get().newObject(MyPerstObject2.class); 
> //there’s a “Id” PK field AUTO_INCREMENT (MySQL)
> 
> newObj.setField1(“valueForField1”);
> 
> newObj.setField2(“valueForField2”);
> 
> newObj.setField3(“valueForField3”);
> 
> newObj.setField4(“valueForField4”);
> 
> newObj.setField5(“valueForField5”);
> 
> newObj.setField6(“valueForField6”);
> 
> context.commitChanges();
> 
> 
> 
> Now, if the commitChanges() in the first thread is invoked e.g. when I 
> performing newObj.setField3(“valueForField3”); in the another thread, the 
> newObj of type MyPerstObject2 should be saved without fields 4,5,6 filled, 
> resulting in ValidationException in the first thread (given that field 4, 5 
> and/or 6 are mandatory).
> 
> I also tried to make the fields 4,5,6 optional, but in this case another 
> exception occurs: 
> 
> org.apache.cayenne.access.OptimisticLockException: [v.3.0 Apr 26 2010 
> 09:59:17] Optimistic Lock Failure, SQL: [UPDATE MyPerstObject2 SET Field1 = 
> ?, Field2 = ?, Field3 = ?, Field4 = ?, Field5 = ?, Field6 = ? WHERE Id IS 
> NULL], WHERE clause bindings: [Id=NULL]
> 
> at 
> org.apache.cayenne.access.jdbc.BatchAction.runAsIndividualQueries(BatchAction.java:232)
> 
> at 
> org.apache.cayenne.access.jdbc.BatchAction.performAction(BatchAction.java:91)
> 
> at 
> org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
> 
> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:269)
> 
> at 
> org.apache.cayenne.access.DataDomainFlushAction.runQueries(DataDomainFlushAction.java:226)
> 
> at 
> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:144)
> 
> at org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:824)
> 
> at org.apache.cayenne.access.DataDomain$2.transform(DataDomain.java:791)
> 
> at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:850)
> 
> at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:788)
> 
> at org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:1106)
> 
> at org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:1045)
> 
> 
> 
> 
> 
> This issue is really driving me crazy!!
> 
> Please, let me know what I’m doing wrong…
> 
> 
> 
> Thank you very much
> 
> Best
> 
> cghersi
> 
> 
> 
> 
> 
> From: Cristiano Ghersi [mailto:[email protected]] 
> Sent: lunedì 12 marzo 2012 10:01
> To: 'Andrus Adamchik [via Cayenne]'
> Subject: RE: Temporary ID hasn't been replaced on commit
> 
> 
> 
> OK, but this is exactly the method that causes the exception L
> 
> 
> 
> Now I’m trying to resolve the problem at the very top, adding a 
> synchronization block to all my context.commitChanges(): this solution, 
> anyway, seems to be too drastic for my application: is there a way to commit 
> changes related only to a single table?
> 
> 
> 
> Thank you very much.
> 
> Best
> 
> cghersi
> 
> 
> 
> From: Andrus Adamchik [via Cayenne] 
> [mailto:[email protected]] 
> Sent: venerdì 9 marzo 2012 17:41
> To: cghersi
> Subject: Re: Temporary ID hasn't been replaced on commit
> 
> 
> 
> Sorry this is Cayenne 3.1 API, and there is a typo :) 
> 
> 3.1: Cayenne.intPkForObject 
> 3.0: DataObjectUtils.intPkForObject 
> 
> On Mar 9, 2012, at 11:33 AM, cghersi wrote: 
> 
> 
>> Hi Andrus, 
>> 
>> I cannot find documentation for your proposal (Cayenne.inPkForObject): may 
>> you give me an example of use? 
>> 
>> 
>> 
>> Thank you very much. 
>> 
>> Best 
>> 
>> cghersi 
>> 
>> 
>> 
>> From: Andrus Adamchik [via Cayenne] [mailto:[hidden email]] 
>> Sent: venerdì 9 marzo 2012 15:40 
>> To: cghersi 
>> Subject: Re: Temporary ID hasn't been replaced on commit 
>> 
>> 
>> 
>>> Is there any effective way to directly retrieve the ID of the just added 
>>> object after the context.commitChanges() invocation? 
>> 
>> After commit the ID should be available via normal Cayenne APIs (e.g. 
>> Cayenne.inPkForObject). So there's something else at play too. 
>> 
>> Andrus 
>> 
>> On Mar 9, 2012, at 9:10 AM, cghersi wrote: 
>> 
>> 
>>> Hi all, perhaps I’ve understood something about the issue: 
>>> 
>>> Seems that the problem arises when I add a new object to the DB: just after 
>>> the insert, I need the autogenerated PK, and this seems to put in troubles 
>>> the method DataObjectUtils.intPKForObject(Persistent); 
>>> 
>>> Which sometimes throws the Exception in the subject. 
>>> 
>>> 
>>> 
>>> Is there any effective way to directly retrieve the ID of the just added 
>>> object after the context.commitChanges() invocation? 
>>> 
>>> 
>>> 
>>> Thank you very much for your help. 
>>> 
>>> 
>>> 
>>> Best 
>>> 
>>> cghersi 
>>> 
>>> 
>>> 
>>> From: cghersi [via Cayenne] [mailto:[hidden email]] 
>>> Sent: mercoledì 7 marzo 2012 09:43 
>>> To: cghersi 
>>> Subject: Re: Temporary ID hasn't been replaced on commit 
>>> 
>>> 
>>> 
>>> Hi Andrus, 
>>> 
>>> here there's the code that I use to save my object: 
>>> 
>>>      private AtomicReference<DataContext> context = new 
>>> AtomicReference<DataContext>(config.getDomain("PacketDomain").createDataCont
>>>  
>>> ext()); 
>>> 
>>>      public Network GetNetworkByPK(Integer pkID) { 
>>>              ObjectId id = new ObjectId(Network.class.getSimpleName(), 
>>> Network.ID_PK_COLUMN, pkID); 
>>> 
>>>              // this constructor implicitly uses "CACHE_REFRESH" policy, 
>>> so a fresh object will be returned 
>>>              ObjectIdQuery query = new ObjectIdQuery(id); 
>>>              return 
>>> (Network)DataObjectUtils.objectForQuery(context.get(), query); 
>>>      } 
>>> 
>>>      public PhysicalNode GetPhysicalNodeByMac(byte[] macAddr){ 
>>>              Expression qualifier = 
>>> ExpressionFactory.matchExp(PhysicalNode.MAC_ADDRESS_PROPERTY, macAddr); 
>>>              List<PhysicalNode> list = query(qualifier, 
>>> PhysicalNode.class); 
>>> 
>>>              //there can be only a single result from this query: 
>>>              return list.get(0); 
>>>      } 
>>> 
>>>      public synchronized PhysicalNode AddPhysicalNode(byte[] macAddr, 
>>> byte[] nsap, int netId, short type, 
>>>                      boolean isOnline, String defaultLabel){ 
>>> 
>>>              PhysicalNode pn=null; 
>>>              Network n = GetNetworkByPK(netId); 
>>>              if(n!=null){ 
>>>                      pn = GetPhysicalNodeByMac(macAddr); 
>>>                      if(pn==null){ 
>>>                              pn = createNewObj(PhysicalNode.class); 
>>>                              pn.setMacAddress(macAddr); 
>>>                              pn.setLabel(defaultLabel); 
>>>                              pn.setCoordX((double)-1); 
>>>                              pn.setCoordY((double)-1); 
>>>                              pn.setCoordZ((double)-1); 
>>>                              pn.setCreation((new Date()).getTime()); 
>>>                      } 
>>>                      pn.setNetwork(n); 
>>>                      pn.setNsap(nsap); 
>>>                      pn.setType(type); 
>>>                      pn.setIsOnline(isOnline); 
>>>                      CommitObjects(PhysicalNode.class); 
>>>              } 
>>>              else{ 
>>>                      throw new ValidationException("Network not in DB"); 
>>>              } 
>>>              return pn; 
>>>      } 
>>> 
>>> The problem is not systematic, but may occur with randomness if I force the 
>>> DB to add a great number of PhysicalNode objects in a little time window. 
>>> 
>>> Please, let me know if you have any idea! 
>>> 
>>> Thank you very much 
>>> Best 
>>> cghersi 
>>> 
>>> _____   
>> 
>> 
>> 
>> 
>> 
>> _____   
>> 
>> If you reply to this email, your message will be added to the discussion 
>> below: 
>> 
>> http://cayenne.195.n3.nabble.com/Temporary-ID-hasn-t-been-replaced-on-commit-tp3801043p3812833.html
>>   
>> 
>> To unsubscribe from Temporary ID hasn't been replaced on commit, click here 
>> < . 
>> <http://cayenne.195.n3.nabble.com/template/NamlServlet.jtp?macro=macro_viewer
>>  
>> <http://cayenne.195.n3.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>>  
>> &id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>>  NAML 
>> 
>> 
>> 
>> -- 
>> View this message in context: 
>> http://cayenne.195.n3.nabble.com/Temporary-ID-hasn-t-been-replaced-on-commit-tp3801043p3813158.html
>> Sent from the Cayenne - User mailing list archive at Nabble.com. 
> 
> 
> 
>  _____  
> 
> If you reply to this email, your message will be added to the discussion 
> below:
> 
> http://cayenne.195.n3.nabble.com/Temporary-ID-hasn-t-been-replaced-on-commit-tp3801043p3813176.html
>  
> 
> To unsubscribe from Temporary ID hasn't been replaced on commit, click here 
> <http://cayenne.195.n3.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3801043&code=Y3Jpc3RpYW5vLmdoZXJzaUBhYm9kYXRhLmNvbXwzODAxMDQzfDUzMzUzMjY3>
>  .
> <http://cayenne.195.n3.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>  NAML 
> 
> 
> 
> --
> View this message in context: 
> http://cayenne.195.n3.nabble.com/Temporary-ID-hasn-t-been-replaced-on-commit-tp3801043p3818939.html
> Sent from the Cayenne - User mailing list archive at Nabble.com.

Reply via email to