Re: UUID as primary key

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Fri Jul 21 2006 - 22:37:07 EDT

  • Next message: Rashid Khan: "PK Column - Cayenne Modeler"

    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