2010-05-20 74 views
3

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

但是我对JDO中的关系还不熟悉。 为了保持它的简单,我有什么看起来是这样的:

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

@PersistentCapable 
class Tag { 
@Persistent String name; 
} 

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

Table: Post 
Columns: PostID, Title, Body 

Table: Tag 
Columns: TagID, name 

Table: PostTag 
Columns: PostID, TagID 

回答

3

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

基本上你创建一个类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; 

我在这里使用了getters/setters,因为您通常将字段设置为private并访问t通过访问器方法来处理,但那是你的呼叫;在上面的代码片段中,'post'和'tag'也应该是你想要链接的已经存在的对象。

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