Yes, much easier if it's just a matter of creating objects in a different order :-)
On Wed, Sep 20, 2017 at 8:45 AM, Nikita Timofeev <[email protected]> wrote: > Other option is to create CommunicationType first and then just use it: > > CommunicationType type = CommunicationType.find("Email"); > > CommunicationLog cl = oc.newObject(CommunicationLog.class); > cl.setCommunicationDT(LocalDateTime.now()); > cl.setCommunicationType(type); > oc.commitChanges(); > > In this case everything will be in one context, and you can freely > commit CommunicationType to DB. > > On Wed, Sep 20, 2017 at 3:37 PM, Mike Kienenberger <[email protected]> wrote: >> I haven't followed the details, so I don't know if using a separate >> object context is necessary, but all you need to do to move a data >> object (in your case "child") to a different context is to call >> parentContext.localObject(childDataObject) which will return >> childDataObjectInParentContext. Note that this requires either a >> hollow or committed childDataObject as a modified (uncommitted) or new >> (uncommitted) data object's changes only exist in the >> childObjectContext. >> >> I may also have the syntax for localObject() wrong as I'm probably >> using an older version of Cayenne than you are. >> >> >> >> On Wed, Sep 20, 2017 at 8:30 AM, Andrew Willerding >> <[email protected]> wrote: >>> I guess my issue is with how independent the commits can be. Now that I >>> better understand this, my code example works as Nikita suggested (with the >>> fix for my problem with the PrimaryKey table) and if I drop the commit >>> during the creation of the child object otherwise the commit during the >>> child creation will fail because the parent has not yet been assigned with >>> the child object. >>> >>> My objective is that I want the creation of the child to be completely >>> independent of the parent object for this situation. To do this I have to >>> create a new ObjectContext for the child object to make it independent of >>> the parent's ObjectContext but when I return the newly created child object >>> to the parent object I get the following >>> >>> Caused by: org.apache.cayenne.CayenneRuntimeException: [v.4.0.B1 Jun 02 2017 >>> 15:11:18] Cannot set object as destination of relationship communicationType >>> because it is in a different ObjectContext >>> at >>> org.apache.cayenne.CayenneDataObject.willConnect(CayenneDataObject.java:399) >>> at >>> org.apache.cayenne.CayenneDataObject.setToOneTarget(CayenneDataObject.java:355) >>> at >>> com.callistacti.clientbase.Database.auto._CommunicationLog.setCommunicationType(_CommunicationLog.java:65) >>> at >>> com.callistacti.clientbase.Panel.PanelGroups.windowClose(PanelGroups.java:423) >>> >>> So what I then needed to do is lookup the child object with the same >>> ObjectContext that the parent was using. >>> >>> Out of curiousity, is there any simpler way of doing this? >>> >>> >>> >>> On 19/09/17 09:16 AM, Aristedes Maniatis wrote: >>>> >>>> On 19/9/17 11:01PM, Andrew Willerding wrote: >>>>> >>>>> The CommunicationType object does not yet exist permanently in the >>>>> database table so how or when does it generate the primary key for the >>>>> object to be referenced by another object before it is committed? I was >>>>> hoping to not have to worry about this as a "high-level" user of Cayenne. >>>> >>>> >>>> You are right, you don't need to worry about all that. Just create one >>>> context and save it at the end. Cayenne tracks the relationships between >>>> objects with a temporary key internally, but you don't need to think about >>>> that. Once Caynenne commits, everything is assigned proper primary keys and >>>> joined. >>>> >>>> Ari >>>> >>>> >>> > > > > -- > Best regards, > Nikita Timofeev
