I take that back, sorry. If I call:

user.getPostsArray() at anytime before doing my addTags() calls I see
that behavior.

users.user has a one to many with Posts

So, if I just call my addTags() they are saved, if I do getPostsArray
() anytime before... nope.

On Sep 26, 12:39 am, whostheJBoss <[email protected]> wrote:
> 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 <[email protected]> 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 
> > <[email protected]>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 <[email protected]> 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 <
> > > [email protected]>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
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
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 [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/transfer-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to