cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mike Kienenberger <mkien...@gmail.com>
Subject Re: Question on how to properly create parent-child nested dependent objects?
Date Wed, 20 Sep 2017 12:37:59 GMT
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
<awillerding@itsurcom.com> 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
>>
>>
>

Mime
View raw message