在JDO中实现标记

时间:2010-05-20 07:09:04

标签: java google-app-engine orm jdo

我正在为使用JDO的网站实施标记系统。 我想使用this方法。

但是我不熟悉JDO中的关系。 为了简单起见,我看起来像这样:

@PersistentCapable
class Post {
@Persistent String title;
@Persistent String body;
}

@PersistentCapable
class Tag {
@Persistent String name;
}

我需要什么样的JDO关系以及如何实现它们?我希望能够列出属于Tag的所有Post,并且还能够列出具有给定Post的所有Tag。所以最后我想有这样的事情:

Table: Post
Columns: PostID, Title, Body

Table: Tag
Columns: TagID, name

Table: PostTag
Columns: PostID, TagID

2 个答案:

答案 0 :(得分:3)

你应该看看:http://code.google.com/appengine/docs/java/datastore/relationships.html#Unowned_Relationships

基本上你创建一个Class PostTag,它的主键上的appart也有两个关键字段用于每个关系:

@PersistentCapable
class PostTag {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key; 
    /*you should add this to Post and Tag as well,
    since this is what the fields in PostTag will reference
    you can rename them to ClassnameID if you like, I believe*/

    @Persistent
    private Key post;

    @Persistent
    private Key tag;
}

然后当你创建PostTag时,你应该做这样的事情

PostTag pt = new PostTag();
pt.setPost(post.getKey());
pt.setTag(tag.getKey());
// persist pt here;

我在这里使用了getter / setter,因为你通常将字段设置为private并通过访问器方法访问它们,但那是你的调用;上述代码段中的“post”和“tag”也应该是您要链接的已保留对象。

编辑:您可能还应该看一下:http://code.google.com/appengine/docs/java/datastore/usingjdo.html#Unsupported_Features_of_JDO因为app引擎只部分实现了JDO(我相信这是因为与传统数据库相比,数据存储的工作方式不同)。他们可能会在将来添加对缺失功能的支持。

答案 1 :(得分:0)

你想要一个JDO支持的many-to-many relationship。但是,App Engine并不完全支持JDO,因此我不知道这是否可行。