【问题标题】:Implementing tagging in JDO在 JDO 中实现标记
【发布时间】:2011-02-21 17:37:23
【问题描述】:

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

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

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

@PersistentCapable
class Tag {
@Persistent String name;
}

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

Table: Post
Columns: PostID, Title, Body

Table: Tag
Columns: TagID, name

Table: PostTag
Columns: PostID, TagID

【问题讨论】:

    标签: java google-app-engine orm jdo


    【解决方案1】:

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

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

    @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,因为您通常将字段设置为私有并通过访问器方法访问它们,但这是您的决定;上面 sn-p 中的 'post' 和 'tag' 也应该是您要链接的已经持久化的对象。

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

    【讨论】:

      【解决方案2】:

      您需要 JDO 支持的 many-to-many relationship。不过App Engine不完全支持JDO,所以不知道能不能这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多