Hmmm, everything I can find on composite keys (the docs, wiki,
transfer config file docs, forums, and the  tPetmarket sample
application) seem to discuss using one to many relationships for
unique composition ids, but not really anything about the many to many
that I need.

And... I can't seem to find in the tPetmarket where the composite key
was actualy USED. I searched for ShoppingCartItem through the source
and for composite. composite turns up only in the Transfer config file
and none of the references to ShoppingCartItem actually use the
composite key. (From what I can tell, and I don't see getCompositeID()
used anywhere). So, I'm at a bit of a loss for examples.

My actual app is far more complex than a blog with posts / comments,
but for that example can you at least point me in the right direction?
I'm not sure how to go about setting up composite keys to achieve the
result I want: comments and blogs that can both have many to many of
tags from the same tags table.



On Sep 25, 9:28 pm, Mark Mandel <mark.man...@gmail.com> wrote:
> Yeah, don't do that with m2m
>
> Use an interim table with composite keys.
>
> Mark
>
> On Sat, Sep 26, 2009 at 2:27 PM, whostheJBoss 
> <dotfus...@changethings.org>wrote:
>
>
>
>
>
>
>
> > Oops, just a typo from removing something. In the actual code they ARE
> > using the same table. It's actually called taglinks
>
> > On Sep 25, 9:02 pm, Mark Mandel <mark.man...@gmail.com> wrote:
> > > In your example they are using different tables, one is using
> > posttags,and
> > > one is using commenttags.
>
> > > I can't guarentee what will happen if you mix n' match m2m relationships
> > on
> > > a single table.  Transfer assumes a m2m is a table with 2 foreign keys on
> > > it, no more, no less.
>
> > > If you want to go down this route, i would suggest an interim object with
> > > composite ids.
>
> > > Mark
>
> > > On Sat, Sep 26, 2009 at 1:50 PM, whostheJBoss <
> > dotfus...@changethings.org>wrote:
>
> > > > :) Perhaps your brain will see the answer to this one instantly (or
> > > > you've got a standard solution for this circumstance). Mine doesn't
> > > > want to see it, I guess.
>
> > > > I am using ColdBox and Transfer and am experiencing some behavior I
> > > > can't wrap my head around. (It's most likely an error in my logic)
>
> > > > I have a Transfer object defined called posts.post which has a many to
> > > > many of tags.tag:
>
> > > > <package name="posts">
> > > >        <object name="post" table="posts">
> > > >                <id name="postID" type="numeric" />
> > > >                <property name="postTitle" type="string"
> > column="postTitle"
> > > > nullable="false" />
>
> > > >                <manytomany name="tags" table="posttags" proxied="true"
> > > > lazy="true">
> > > >                        <post to="posts.post" column="postID"/>
> > > >                        <post to="tags.tag" column="tagID"/>
> > > >                        <collection type="array">
> > > >                        </collection>
> > > >                </manytomany>
>
> > > >        </object>
> > > > </package>
>
> > > > <package name="tags">
> > > >        <object name="tag" table="tags"
> > > > decorator="components.decorators.tags">
> > > >                <id name="tagID" type="numeric" />
> > > >                <property name="tagTitle" type="string"
> > column="tagTitle"
> > > > nullable="false" />
> > > >        </object>
> > > > </package>
>
> > > > I also have a Transfer object called comments.comment which also needs
> > > > a many to many of the tags.tag object
>
> > > > Basically, I have posts and comments, both of which have tags. I want
> > > > them to share the same tags table.
>
> > > > In my posttags (the link table) table I have:
>
> > > > postTagID
> > > > tagID
> > > > postID
> > > > commentID
>
> > > > So, before I add the comments.comment object to the mix, everything is
> > > > fine. I can add tags to my posts.post objects and they are saved in
> > > > the database as they should be when I used Transver.save(), everything
> > > > works great. The commentID field in the posttags table isn't used at
> > > > this  point.
>
> > > > So, if I add:
>
> > > > <package name="comments">
> > > >        <object name="comment" table="comments">
> > > >                <id name="commentID" type="numeric" />
> > > >                <property name="commentTitle" type="string"
> > > > column="commentTitle"
> > > > nullable="false" />
>
> > > >                <manytomany name="tags" table="commenttags"
> > proxied="true"
> > > > lazy="true">
> > > >                        <comment to="comments.comment"
> > column="commentID"/>
> > > >                        <comment to="tags.tag" column="tagID"/>
> > > >                        <collection type="array">
> > > >                        </collection>
> > > >                </manytomany>
>
> > > >        </object>
> > > > </package>
>
> > > > This also gives the comments.comment objects a many to many with
> > > > tags.tag on commentID (instead of postID)
>
> > > > So, when viewing these objects on a page, it works fine. I can do:
>
> > > > instance.Transfer.get("comments.comment", 1) and dump the object's
> > > > getTagsArray() and see all of the associated tags.
>
> > > > I can do:
>
> > > > instance.Transfer.get("posts.post", 1) and dump the object's
> > > > getTagsArray() and see all of the associated tags.
>
> > > > Both objects work fine for retrieving data.
>
> > > > So, if I do:
>
> > > > // get a post
> > > > myPost = instance.Transfer.get("posts.post", 1);
>
> > > > // get two tags
> > > > tag1 = instance.Transfer.get("tags.tag", 1);
> > > > tag2 = instance.Transfer.get("tags.tag", 2);
>
> > > > // add the tags to the post
> > > > myPost.addTags(tag1);
> > > > myPost.addTags(tag2);
>
> > > > I am just adding two tags to post with ID 1.
>
> > > > If I dump myPost.getTagsArray() I see both tags appear properly in the
> > > > array, however, if I add:
>
> > > > instance.Transfer.save(myPost); after the two addTags() lines to save
> > > > the myPost object and then dump mypost.getTagsArray(), after the save,
> > > > the tags are gone. They do not save and do not show up in the database
> > > > in the posttags table.
>
> > > > When I check the SQL output, no inserts have been run.
>
> > > > Somehow, saving the object drops the many to many relationships it had
> > > > right before save.
>
> > > > If I remove the many to many on the comments.comment object, the
> > > > posts.post save begins to work and save the tags and inserts them into
> > > > the database. So, having two objects with the same many to many, even
> > > > on different fields, causes erratic behavior.
>
> > > > Obviously I can addTags() fine, they show up in the object, they just
> > > > won't save whenever another object also has a many to many with the
> > > > same object I'm trying to save.
>
> > > > As a workaround, I created a second tag object:
>
> > > >        <object name="ctag" table="tags"
> > > > decorator="components.decorators.tags">
> > > >                <id name="tagID" type="numeric" />
> > > >                <property name="tagTitle" type="string"
> > column="tagTitle"
> > > > nullable="false" />
> > > >        </object>
>
> > > > Then told the many to many on comments.comment to use that object
> > > > instead:
>
> > > >        <manytomany name="tags" table="commenttags" proxied="true"
> > > > lazy="true">
> > > >                <comment to="comments.comment" column="commentID"/>
> > > >                <comment to="tags.ctag" column="tagID"/>
> > > >                <collection type="array">
> > > >                </collection>
> > > >        </manytomany>
>
> > > > Doing this allows me to add tags to both posts.post objects and
> > > > comments.comment object without problems, but it feels like a cheap
> > > > way of doing this since I'm using two different tag objects which
> > > > represent the same data.
>
> > > > (One other odd note... If I reinitialize my ColdBox application on the
> > > > page that adds tags to and save the posts.post object before calling
> > > > any others, it begins to work. After that, I can add all the tags I
> > > > want to posts.post and they get saved, even when the comments.comment
> > > > many to many for tags.tag also exists. Although, sometimes this only
> > > > works the first time I hit the page. However, if I reinitialize my
> > > > application on any other page BUT the one that adds and saves tags,
> > > > then when I do try to call that page, the tags aren't saved to the
> > > > database. They show up on the object after they've been added, but
> > > > once I do Transfer.save() on the object, they are no longer there.)
>
> > > > Perhaps this is some funky cache / object recreation issue, but I'm
> > > > not sure at all at this point. I thought maybe whichever object uses
> > > > the many to many relationship first (comments.comment or posts.post)
> > > > would be the only one that could save the tags, but I'm not sure. I
> > > > can still add tags to either one and they show up in the array, but
> > > > once I save... poof, they are gone.
>
> > > > I'm just looking for the "right" way to set this up, where two objects
> > > > need to both have a many to many on the same object.
>
> > > > Like I said, right now I can just use a second tag object definition
> > > > on a different column and that seems to resolve things, it just
> > > > doesn't "feel" right. Especially if I update the tag's data, then both
> > > > tags.tag and tags.ctag would have to be updated, and, well, that's
> > > > getting into tricky territory.
>
> > > > ANY suggestions would help, really just looking for the right way to
> > > > structure this. I should be able to deduce the basic logic from
> > > > someone saying "Oh, you just need to have many to many on [insert the
> > > > answer I need here] instead" =)
>
> > > --
> > > E: mark.man...@gmail.com
> > > T:http://www.twitter.com/neurotic
> > > W:www.compoundtheory.com
>
> --
> E: mark.man...@gmail.com
> T:http://www.twitter.com/neurotic
> W:www.compoundtheory.com
--~--~---------~--~----~------------~-------~--~----~
Before posting questions to the group please read:
http://groups.google.com/group/transfer-dev/web/how-to-ask-support-questions-on-transfer

You received this message because you are subscribed to the Google Groups 
"transfer-dev" group.
To post to this group, send email to transfer-dev@googlegroups.com
To unsubscribe from this group, send email to 
transfer-dev-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/transfer-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to