Re: Hierarchical relationship problems

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Mon Apr 25 2005 - 16:34:07 EDT

  • Next message: Filip Balas: "Re: Hierarchical relationship problems"

    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



    This archive was generated by hypermail 2.0.0 : Mon Apr 25 2005 - 16:34:09 EDT