Re: Hierarchical relationship problems

From: Filip Balas (fbala..mail.com)
Date: Mon Apr 25 2005 - 17:06:59 EDT

  • Next message: Dhruti Ramani: "Comparing two Dates in cayenne"

    Hmmm, okay I don't like to blame someone else's code
    unless I'm 100% sure. Later today I will set up a purely
    clean test (seperate table, seperate map, sperate test class).
    If this doesn't work I'll submit a bug...

    Thanks again,
    Filip

    On 4/25/05, Andrus Adamchik <andru..bjectstyle.org> wrote:
    > I am still dubious that this is Cayenne problem as we have test cases that
    > cover this situation. So I recommend doublechecking that you don't have
    > your old incorrect DataMap sitting somewhere in the classpath, and also
    > check if it works with Cayenne 1.1.1 (unless your code depends heavily on
    > 1.2 API making this impossible).
    >
    > If it still doesn't work, please submit a bug report containing DataMap
    > XML file and a code snippet that trigers this fetch.
    >
    > Andrus
    >
    >
    > > I'm on the bleeding edge (could be why I'm having the
    > > problem) cayenne 1.2M3.
    > >
    > > Filip
    > >
    > >
    > > On 4/25/05, Andrus Adamchik <andru..bjectstyle.org> wrote:
    > >> You shouldn't have to do anything special. Cayenne (including the
    > >> Modeler) works fine with simple parent-child hierarchies. For
    > >> "children" I expect the generated query to look even simpler:
    > >>
    > >> SELECT t0.description, t0.id, t0.parent_id
    > >> FROM dbo.IMV_locations t0, dbo.IMV_locations t1
    > >> WHERE t0.parent_id = ? [bind: 1]
    > >>
    > >> So ... What version of Cayenne do you have? There was a bug long time
    > >> ago that messed it up, but I am fairly sure it is fixed in 1.1 final
    > >> and 1.1.1 releases.
    > >>
    > >> Andrus
    > >>
    > >>
    > >> > Hi Andrus,
    > >> >
    > >> > Yes that makes perfect sense. I didn't catch that error, I just
    > >> assumed the modeler would generate the right xml when
    > >> > I selected the proper source and target.
    > >> >
    > >> > However, even when I corrected the xml manually to your
    > >> > suggestion, I still have the following statement generated
    > >> > by cayenne:
    > >> >
    > >> > SELECT t0.description, t0.id, t0.parent_id
    > >> > FROM dbo.IMV_locations t0, dbo.IMV_locations t1
    > >> > WHERE t0.parent_id = t1.id AND (t1.parent_id = ?) [bind: 1]
    > >> >
    > >> > I need it to read:
    > >> >
    > >> > SELECT t0.description, t0.id, t0.parent_id
    > >> > FROM dbo.IMV_locations t0, dbo.IMV_locations t1
    > >> > WHERE t0.parent_id = t1.id AND (t1.id = ?) [bind: 1]
    > >> >
    > >> > In another spot in my code I have a hierarchy set up but
    > >> > it is a many to many (map, not tree) and cayenne seems
    > >> > to deal with that beautifully. To achieve this I have an
    > >> intermediate table that maps locations to one another. Will I have
    > >> to add
    > >> > this extra table with a one-To-one constraint to ensure a tree
    > >> structure and not a map?
    > >> >
    > >> > Thanks to all who have answered.
    > >> > Your help is greatly appreciated.
    > >> > Filip
    > >> >
    > >> >
    > >> >
    > >> > On 4/24/05, Andrus Adamchik <andru..bjectstyle.org> wrote:
    > >> >> Hi Filip,
    > >> >>
    > >> >> > <obj-relationship name="children" source="Location"
    > >> >> target="Location" deleteRule="Cascade"
    > >> >> > db-relationship-path="rel_children.rel_children"/>
    > >> >> >
    > >> >> > <obj-relationship name="parent" source="Location"
    > >> target="Location"
    > >> >> db-relationship-path="rel_parent.rel_parent"/>
    > >> >>
    > >> >> The way relationships above are mapped you'll be getting
    > >> GRANDchildren and GRANDparents. Is this really what you want? The
    > >> query you quote seems correct (for grandchildren). What I mean is
    > >> that
    > >> >>
    > >> >>
    > >> >> > SELECT t0.description, t0.id, t0.parent_id
    > >> >> > FROM dbo.IMV_locations t0, dbo.IMV_locations t1
    > >> >> > WHERE t0.parent_id = t1.id AND (t1.parent_id = ?) [bind: 1]
    > >> >>
    > >> >> is a short form for
    > >> >>
    > >> >> SELECT t0.description, t0.id, t0.parent_id
    > >> >> FROM dbo.IMV_locations t0, dbo.IMV_locations t1, dbo.IMV_locations
    > >> t2 WHERE t0.parent_id = t1.id AND t1.parent_id = t2.id AND t2.id =
    > >> ? [bind: 1]
    > >> >>
    > >> >> (see an extra join)... If you need direct children, then you need
    > >> to remove the last component in the obj-relationship path. The
    > >> resulting mapping should look like this:
    > >> >>
    > >> >>
    > >> >> <obj-relationship name="children" source="Location"
    > >> target="Location" deleteRule="Cascade"
    > >> >> db-relationship-path="rel_children"/>
    > >> >>
    > >> >> <obj-relationship name="parent" source="Location" target="Location"
    > >> db-relationship-path="rel_parent"/>
    > >> >>
    > >> >> I hope I understood your requirements correctly...
    > >> >>
    > >> >> Andrus
    > >> >>
    > >> >>
    > >> >
    > >> >
    > >> > --
    > >> > Cell : 403.461.7895
    > >> > Work: 403.770.1534
    > >> > MSN: fbala..otmail.com
    > >>
    > >>
    > >
    > >
    > > --
    > > Cell : 403.461.7895
    > > Work: 403.770.1534
    > > MSN: fbala..otmail.com
    >
    >

    -- 
    Cell  : 403.461.7895
    Work: 403.770.1534
    MSN:  fbala..otmail.com
    



    This archive was generated by hypermail 2.0.0 : Mon Apr 25 2005 - 17:07:01 EDT