I see. That makes sense - each DataContext in a nested context chain
would create its own instance of object and transition it through the
lifecycle. So technically it is still called once per object
instance. However the fact that ID can be passed from a peer object
in the upstream context requires an extra check. E.g.:
public void setPersistenceState(int state) {
super.setPersistenceState(state);
if (state == PersistenceState.NEW && getObjectId() == null) {
setId(UUID.randomUUID());
}
}
Andrus
On Jul 21, 2006, at 5:35 PM, Øyvind Harboe wrote:
> On 7/13/06, Andrus Adamchik <andru..bjectstyle.org> wrote:
>>
>>
>> On Jul 13, 2006, at 12:32 PM, Øyvind Harboe wrote:
>>
>> > On 7/12/06, Gentry, Michael (Contractor)
>> > <michael_gentr..anniemae.com> wrote:
>> >> You could override setPersistenceState() in your Treatment class:
>> >>
>> >> public void setPersistenceState(int state)
>> >> {
>> >> super.setPersistenceState(state);
>> >>
>> >> // If object was just created, set PK
>> >> if (state == PersistenceState.NEW)
>> >> setId(UUID.randomUUID());
>> >> }
>> >
>> > Hmmm... I tried that, but setPersistanceState() is invoked
>> multilple
>> > times with state=NEW and thus I'm changing the UUID each time. That
>> > can't be right.
>>
>> No it can't - it should only be invoked once per object.
>
>
> As far as I can tell in the debugger setPersistanceState(state=NEW)
> is being
> invoked multiple times..
>
> First when I create the object and then later on when I commit
> (there are
> child contexts involved, and I first commit to parent, then to the
> database):
>
>
> if (dataObject.getObjectId() == null) {
> dataObject.setObjectId(new ObjectId(objEntity.getName
> ())); //
> DataContext.registerNewObject(DataObject) line: 920
> }
>
>
>
> Treatment(Workaround).setPersistenceState(int) line: 31
> DataContext.registerNewObject(DataObject) line: 920
> ChildDiffLoader.nodeCreated(Object) line: 110
> NodeCreateOperation.apply(GraphChangeHandler) line: 73
> CompoundDiff.apply(GraphChangeHandler) line: 133
> ObjectStoreGraphDiff.apply(GraphChangeHandler) line: 155
> DataContext.onContextFlush(ObjectContext, GraphDiff, boolean) line:
> 1215
> DataContext.onSync(ObjectContext, GraphDiff, int) line: 1194
> DataContext.flushToParent(boolean) line: 1261
> DataContext.commitChanges() line: 1165
> EditTreatment$Enhance_217(EditTreatment).submit(IRequestCycle)
> line: 142
>
>
>
> --
> Øyvind Harboe
> http://www.zylin.com
This archive was generated by hypermail 2.0.0 : Fri Jul 21 2006 - 22:37:30 EDT