Re: how to remove object from context ?

From: Marcin Skladaniec (marci..sh.com.au)
Date: Thu May 11 2006 - 01:19:19 EDT

  • Next message: Jeff Genender: "Re: CGLib help"

    Hello !

    On 10/05/2006, at 12:53 PM, Marcin Skladaniec wrote:

    > Hello
    >
    > I think someone already asked about that, but I cant find this post.
    >
    > I have a problem with removing objects from context. I tried :
    >
    > CayenneContext context = new CayenneContext(channel, true, true);
    > CSite site = (CSite) context.newObject(CSite.class);
    > context.getGraphManager().unregisterNode(site);
    >
    > but the object is still in the context (it is still in getContext
    > ().uncommittedObjects() list ).

    I was wrong. I shall do context.getGraphManager().unregisterNode
    (site.getObjectId()); and now it works.
    but the second part is still a problem

    >
    > if I do
    > CayenneContext context = new CayenneContext(channel, true, true);
    > CSite site = (CSite) context.newObject(CSite.class);
    > context.deleteObject(site);
    >
    > there is a null object in context, so I feel like I'm hitting some
    > bug. I started to browse code (Its good to have access to
    > repository again !).
    >
    > I have noticed that in ObjectContextDeleteAction there is a
    > deleteNew method which makes a call to
    > context.getGraphManager().unregisterNode(object.getObjectId());
    >
    > so I followed it futher to GraphMap and CayenneContextGraphManager
    > and I realized that the latter does not pay attention to
    > unregisterNode(), and therefore stateLog which keeps dirtyIds is
    > not updated.
    >

    I have taken a second look at CayenneContextGraphManager and
    GraphMap. Why there are two locations where nodes are being stored ?
    One is in GraphMap as nodes, and the second is in
    CayenneContextGraphManager in stateLog. (It looks like the stateLog
    is more important)
    In the ObjectContextDeleteAction there are separate methods for
    deleting !(NEW) and NEW objects :

         private void deletePersistent(Persistent object) {
             int oldState = object.getPersistenceState();
             object.setPersistenceState(PersistenceState.DELETED);
             processDeleteRules(object, oldState);
             context.getGraphManager().nodeRemoved(object.getObjectId());
         }

         private void deleteNew(Persistent object) {
             object.setPersistenceState(PersistenceState.TRANSIENT);
             processDeleteRules(object, PersistenceState.NEW);
             context.getGraphManager().unregisterNode(object.getObjectId());
         }

    I believe that the last line shall in both method should be the same,
    because now those methods are affecting different lists of nodes.
    unregisterNode has no impact on list which returned by
    uncommitedObjects() method, so I believe this is causing the phantom
    object to be committed. Now I have tried it, the phantom object is
    committed to the database.

    Beside, the anonymous svn access to cayenne repository does not work.
    Clicking on http://svn.apache.org/repos/asf/incubator/cayenne/main/
    trunk/cayenne/ gives ' (111) Connection refused '

    Regards
    Marcin

    >
    > -------------------------->
    > ish
    > http://www.ish.com.au
    > Level 1, 30 Wilson Street Newtown 2042 Australia
    > phone +61 2 9550 5001 fax +61 2 9550 4001
    >
    >

    -------------------------->
    ish
    http://www.ish.com.au
    Level 1, 30 Wilson Street Newtown 2042 Australia
    phone +61 2 9550 5001 fax +61 2 9550 4001



    This archive was generated by hypermail 2.0.0 : Thu May 11 2006 - 01:19:47 EDT