Re: 1:n deletion problem

From: Craig Miskell (cmiskel..lbatross.co.nz)
Date: Tue Jan 14 2003 - 18:17:45 EST

  • Next message: Andrus Adamchik: "Re: 1:n deletion problem"

    Easy. Simply removing the projectuser from the user will not trigger
    deletion. The behaviour you are seeing is quite correct (you may be
    used to WebOBjects/EOF, where such relationships can be set up (Owns
    destination) such that removing does delete the destination object.
    Cayenne doesn't have that (yet... don't know if it will, we'll have to
    discuss that on the dev list).

    Now to the solution:
    You say you're using release alpha-5-1. If you open the model in
    CayenneModeller, you may notice that the ObjRelationships have an
    additional column on the right of their specification, titled "Delete
    rule". In a5-1, the actual implementation of that is disabled (some
    bugs that mucked up constraints ... tested initially on mysql, committed
    to cvs, then discovered it failed on Oracle which actually has
    constraints. Bah humbug).

    If you get the nightly build, the implementation has been sorted out.
    So, what you'd do is set the relationship from ProjectUser to User to be
    Nullify (actually, that's the default). Then, your for loop would look
    like this (parentheses might be wrong):

    for (int i=0; i<projectuserss.size(); i++) {
      ctxt.deleteObject(((Projectusers)projectuserss.get(i)));
    }

    The delete rule is fired when you delete the ProjectUser. It looks at
    all of the relationships from ProjectUser to other ObjEntities. For
    nullify, it looks at the reverse relationship (user projectusersArray in
    this case). If it's toOne, it is set to null. If to-Many (your case),
    the object being deleted will be removed from that relationship. If
    there is no reverse relationship, nothing happens. The other rules are
    Cascade (if you set this relationship to cascade, the User would be
    deleted) and Deny, which throws an exception when you try to delete if
    the destination has any objects.

    Let me know if you need more help on this.. I'm planning on writing
    docos on it, but haven't yet had the time (actually, more like "not had
    the inclination", but lack of time sounds better :-))

    Craig Miskell

    On Wed, 2003-01-15 at 12:27, Fan, Bill (AP - Australia) wrote:
    > Hi All,
    >
    > I'm having problem to use the X.removeFromYArray(y) function to delete the
    > 1:n relationship records in the database. I'm using tomcat 4.1.17 + Struts
    > 1.1 + Cayenne-1.0a5-1.
    >
    > It is a project issue management system. There are 4 tables in the user
    > management section - Project, Users, Role & ProjectUsers. The tables are
    > defined as following (in brief):
    >
    > Project:
    > ProjectId int PK
    > ProjectName varchar(100)
    >
    > Users: (oops, can't use User in MSSQL, don't get confused below... )
    > UserId int PK
    > Login varchar(50)
    > Password varchar(20)
    >
    > Role:
    > RoleId int PK
    > RoleDesc varchar(50)
    >
    > ProjectUsers:
    > ProjectId int FK
    > UserId int FK
    > RoleId int FK
    >
    > ProjectUsers table holds all the information how the user can access the
    > system. When I come to the section to edit/modify the user roles, I need to
    > delete the records in this table for a user related to a particular project,
    > then add the new ones. The logic related to the deletion process is as
    > following:
    >
    > // 1. get the user object
    > Users users = getUsers(ctxt, login);
    >
    > // 2. get the all related projectuser objects(regardless what
    > project for now)
    > List projectuserss = user.getProjectusersArray();
    >
    > // 3. iterating through the projectusers list and remove them:
    > for (int i=0; i<projectuserss.size(); i++)
    >
    > user.removeFromProjectusersArray((Projectusers)projectuserss.get(i));
    >
    > // 4. finally, commit the changes
    > ctxt.commitChanges(Level.WARN);
    >
    > No matter what I did, just can't see the DELETE statement generated by
    > Cayenne from the tomcat running console, and the database records are not
    > removed obviously.
    >
    > The users object and the related projectuserss list returned by the
    > statements can be verified they are all correct. I've tried to set the users
    > object consistence state by using
    > users.setPersistenceState(PersistenceStte.MODIFIED) right after I get the
    > users object, eventhough it is not the case in the
    > RemovePaintingFroGalleryAction example.
    >
    > On the other hand, the users.addToProjectusersArray(projectusers) function
    > is working perfectly (I've added lot of duplicated records ;- )
    >
    >
    > What I'm doing wrong here? Can anyone point me to the right direction?
    >
    >
    > Thanks for your help!
    >
    > Bill
    >
    >
    >
    >
    >
    >
    >



    This archive was generated by hypermail 2.0.0 : Tue Jan 14 2003 - 18:14:32 EST