You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@turbine.apache.org by Charles Duffy <cd...@mvista.com> on 2002/03/07 23:56:34 UTC

Issues w/ Torque joins & deletes

Howdy. I have three tables: section, option and position. The
relationship between each is 1:n (so there can be n options per 1
section and n positions per 1 option). There are no foreign keys which
reference the option table.

I'm trying to write code to delete a section and all the options and
positions associated with it. In trying to select all the associated
options, I do the following:

Criteria crit = new Criteria();
crit.add(PositionPeer.SECTION_ID, getSectionId());
crit.addJoin(SectionPeer.SECTION_ID, PositionPeer.SECTION_ID);
crit.addJoin(PositionPeer.POSITION_ID, OptionPeer.POSITION_ID);
OptionPeer.doDelete(crit);

When this segment gets run, however, the following occurs:

3361 [main] DEBUG org.apache.torque.util.BasePeer  - BasePeer.doDelete: whereClause=SECTION_ID=2
org.apache.torque.TorqueException: ERROR:  <unnamed> referential integrity violation - key in position still referenced from option

It appears that a deletion from position (rather than option) is being
attempted. I've surrounded the code in question with logging statements,
so I'm quite certain of its position.

Calling OptionPeer.doSelect(crit) for this same criteria results in the
correct data being returned. Indeed, the following (less efficient) code
snippet works:

crit = new Criteria();
crit.add(PositionPeer.SECTION_ID, getSectionId());
crit.addJoin(SectionPeer.SECTION_ID, PositionPeer.SECTION_ID);
crit.addJoin(PositionPeer.POSITION_ID, OptionPeer.POSITION_ID);
Vector v = OptionPeer.doSelect(crit);
for(int i=0; i<v.size(); i++) {
    ((Option)(v.elementAt(i))).remove();
}

where Option.remove() is simply a call to OptionPeer.doDelete(this)

Anyone know what's going on here?

Thanks!

Re: Issues w/ Torque joins & deletes

Posted by Marty Phee <mp...@jump-technologies.com>.
I tried to do the same thing, and ended up hard-coding the doDelete with
the parent, and then the child.

Doesn't the Criteria object have a Cascade option?  I looked through the
doDelete code, and there is code that looks for children, but it didn't
seem to work.  I never went and stepped through it though.

Personally I like this option:

> Criteria crit = new Criteria();
> crit.add(PositionPeer.SECTION_ID, getSectionId());
> crit.addJoin(SectionPeer.SECTION_ID, PositionPeer.SECTION_ID);
> crit.addJoin(PositionPeer.POSITION_ID, OptionPeer.POSITION_ID);
> OptionPeer.doDelete(crit);

I like having control over what happens.


On Thu, 2002-03-07 at 19:47, John McNally wrote:
> The doDelete method does nothing more than delete a single row, if it
> can find the primary key in the Criteria passed in.  It is not a very
> elaborate method.  Unless you want to work on it to make it better, I
> can only suggest to hardcode your sql and use BasePeer.executeStatement
> 
> john mcnally
> 
> Charles Duffy wrote:
> > 
> > Howdy. I have three tables: section, option and position. The
> > relationship between each is 1:n (so there can be n options per 1
> > section and n positions per 1 option). There are no foreign keys which
> > reference the option table.
> > 
> > I'm trying to write code to delete a section and all the options and
> > positions associated with it. In trying to select all the associated
> > options, I do the following:
> > 
> > Criteria crit = new Criteria();
> > crit.add(PositionPeer.SECTION_ID, getSectionId());
> > crit.addJoin(SectionPeer.SECTION_ID, PositionPeer.SECTION_ID);
> > crit.addJoin(PositionPeer.POSITION_ID, OptionPeer.POSITION_ID);
> > OptionPeer.doDelete(crit);
> > 
> > When this segment gets run, however, the following occurs:
> > 
> > 3361 [main] DEBUG org.apache.torque.util.BasePeer  - BasePeer.doDelete: whereClause=SECTION_ID=2
> > org.apache.torque.TorqueException: ERROR:  <unnamed> referential integrity violation - key in position still referenced from option
> > 
> > It appears that a deletion from position (rather than option) is being
> > attempted. I've surrounded the code in question with logging statements,
> > so I'm quite certain of its position.
> > 
> > Calling OptionPeer.doSelect(crit) for this same criteria results in the
> > correct data being returned. Indeed, the following (less efficient) code
> > snippet works:
> > 
> > crit = new Criteria();
> > crit.add(PositionPeer.SECTION_ID, getSectionId());
> > crit.addJoin(SectionPeer.SECTION_ID, PositionPeer.SECTION_ID);
> > crit.addJoin(PositionPeer.POSITION_ID, OptionPeer.POSITION_ID);
> > Vector v = OptionPeer.doSelect(crit);
> > for(int i=0; i<v.size(); i++) {
> >     ((Option)(v.elementAt(i))).remove();
> > }
> > 
> > where Option.remove() is simply a call to OptionPeer.doDelete(this)
> > 
> > Anyone know what's going on here?
> > 
> > Thanks!
> > 
> >   ------------------------------------------------------------------------
> >    Part 1.2Type: application/pgp-signature
> 
> --
> To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
> For additional commands, e-mail: <ma...@jakarta.apache.org>
> 



--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: Issues w/ Torque joins & deletes

Posted by John McNally <jm...@collab.net>.
The doDelete method does nothing more than delete a single row, if it
can find the primary key in the Criteria passed in.  It is not a very
elaborate method.  Unless you want to work on it to make it better, I
can only suggest to hardcode your sql and use BasePeer.executeStatement

john mcnally

Charles Duffy wrote:
> 
> Howdy. I have three tables: section, option and position. The
> relationship between each is 1:n (so there can be n options per 1
> section and n positions per 1 option). There are no foreign keys which
> reference the option table.
> 
> I'm trying to write code to delete a section and all the options and
> positions associated with it. In trying to select all the associated
> options, I do the following:
> 
> Criteria crit = new Criteria();
> crit.add(PositionPeer.SECTION_ID, getSectionId());
> crit.addJoin(SectionPeer.SECTION_ID, PositionPeer.SECTION_ID);
> crit.addJoin(PositionPeer.POSITION_ID, OptionPeer.POSITION_ID);
> OptionPeer.doDelete(crit);
> 
> When this segment gets run, however, the following occurs:
> 
> 3361 [main] DEBUG org.apache.torque.util.BasePeer  - BasePeer.doDelete: whereClause=SECTION_ID=2
> org.apache.torque.TorqueException: ERROR:  <unnamed> referential integrity violation - key in position still referenced from option
> 
> It appears that a deletion from position (rather than option) is being
> attempted. I've surrounded the code in question with logging statements,
> so I'm quite certain of its position.
> 
> Calling OptionPeer.doSelect(crit) for this same criteria results in the
> correct data being returned. Indeed, the following (less efficient) code
> snippet works:
> 
> crit = new Criteria();
> crit.add(PositionPeer.SECTION_ID, getSectionId());
> crit.addJoin(SectionPeer.SECTION_ID, PositionPeer.SECTION_ID);
> crit.addJoin(PositionPeer.POSITION_ID, OptionPeer.POSITION_ID);
> Vector v = OptionPeer.doSelect(crit);
> for(int i=0; i<v.size(); i++) {
>     ((Option)(v.elementAt(i))).remove();
> }
> 
> where Option.remove() is simply a call to OptionPeer.doDelete(this)
> 
> Anyone know what's going on here?
> 
> Thanks!
> 
>   ------------------------------------------------------------------------
>    Part 1.2Type: application/pgp-signature

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>