Thank you, using DataContext.createDataContext() and pulling objects in
with dc.localObject() looks promising! I'll test it out when I get a
chance (getting sidetracked with another project).

Thanks again!

On 2016-05-20 09:58 PM, Michael Gentry wrote:
> Hi Brian,
>
> "is there any way to specify which individual objects you want to commit"
>
> Not really.  Cayenne works at the object graph level and an ObjectContext
> (or DataContext) is what is used to manage your graph changes and then
> commit them in a single database transaction.
>
> That being said, there is nothing stopping you from creating many more
> ObjectContexts and it is cheap to do so.  In your example, you would:
>
> 1) create a brand new ObjectContext totally separate of the thread
> ObjectContext,
> 2) create your exception log object in that new ObjectContext,
> 3) commit the new ObjectContext (which only has your exception log object
> in it).
>
> Since you mentioned you are using 3.0.2, this is easily done with
> DataContext.createDataContext().  Cayenne 3.1 requires you to get it from
> the ServerRuntime.
>
> I'd be wary of creating children of your thread's ObjectContext for this
> purpose as committing child contexts will also commit the parent, if I'm
> remembering correctly.
>
> If your exception log object needs a relationship to an object in the
> thread context, you'll either have to pull it in using DC's localObject()
> method or perhaps DataObjectUtils.objectForPK(), assuming that object is
> already persisted.  I tend to use the latter approach, typically with the
> original object's getObjectId() method.
>
> mrg
>
>
> On Thu, May 19, 2016 at 12:22 PM, Brian Baillargeon <bbail...@uwo.ca> wrote:
>
>> Hey folks,
>>
>> Generally, I retrieve objects using
>> BaseContext.getThreadObjectContext().performQuery(query);
>> and after creating / updating / deleting objects, I commit changes with
>> BaseContext.getThreadObjectContext().commitChanges();
>>
>> This commits all changes on the current thread's ObjectContext, but is
>> there any way to specify which individual objects you want to commit
>> changes for? I'm just looking for a best practice to safeguard my
>> objects, but I think this would be a valid use case:
>> You have a table that logs exceptions, and you encounter an exception
>> while modifying an object backed by another table. So you want to
>> persist the exception's log, but not the object you were modifying.
>>
>> I've thought about separating my objects onto different ObjectContexts
>> (Ie. children of getThreadObjectContext()), but this doesn't seem like a
>> good solution, especially if you have relationships (since related
>> objects have to be in the same ObjectContext).
>>
>> Any suggestions? I'm using Cayenne 3.0.2, but I'm all ears for 3.1
>> suggestions too.
>>
>> Thanks,
>> Brian Baillargeon
>>
>>


Reply via email to