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 <[EMAIL PROTECTED]> wrote:
On Jul 13, 2006, at 12:32 PM, Øyvind Harboe wrote:
> On 7/12/06, Gentry, Michael (Contractor)
> <[EMAIL PROTECTED]> 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