RE: 1:n deletion problem

From: Fan, Bill (AP - Australia) ("Fan,)
Date: Tue Jan 14 2003 - 20:11:55 EST

  • Next message: Craig Miskell: "RE: 1:n deletion problem"

    Ooops, Andrus,

    The line of ctxt.deleteObject(obj) will remove all the records in the
    ProjectUsers table regardless what record the obj is linked to.

    Bill

    -----Original Message-----
    From: Andrus Adamchik [mailto:andru..bjectstyle.org]
    Sent: Wednesday, January 15, 2003 9:22 AM
    To: cayenne-use..bjectstyle.org
    Subject: Re: 1:n deletion problem

    Craig, Bill,

    I think there is a solution that does not involve the nightly build (Or am
    I missing something in this discussion?). Simply delete an object after
    unsetting relationship:

    for(int i=0; i<projectuserss.size(); i++) {
       Projectuser obj = (Projectusers)projectuserss.get(i);
       user.removeFromProjectusersArray(obj);

       // !!! This Line Is Added
       ctxt.deleteObject(obj);
    }
    ctxt.commitChanges(Level.WARN);

    Andrus

    > 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 - 19:12:23 EST