如何在JDO中映射父子关系,其中每个父项都有一个子列表?

时间:2011-02-05 17:17:36

标签: database google-app-engine parent-child entity-relationship jdo

我是JDO的新手,但是我愿意用它来使我的代码可移植(目前我正在使用AppEngine,这就是为什么)。在下面的Google Talk:http://dl.google.com/io/2009/pres/W_0415_Building_Scalable_Complex_App_Engines.pdf中,Brett Slatkin展示了一种新的高效模式,可以使用子键[幻灯片23 - 25]检索父实体。在他的例子中,他没有Python中的类的父子关系映射。我不知道Python是如何工作的,但我在JDO中猜测,你需要在某处指定父级。因此,对于以下代码,我如何将MessageIndex作为子映射到Message:

// Message.java
@PersistenceCapable
public class Message {
    @PrimaryKey
    @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
    Long id;

    @Persistent String sender;
    @Persistent Text body;
}

// MessageIndex.java
public class MessageIndex {
    @PrimaryKey
    @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
    Long id;

    @Persistent List<String> receivers;
}

// Query.java - Query Example
Query query = pm.newQuery("select id from MessageIndex" +
                          "where receivers == NameParam " +
                          "parameters String NameParam");
List<Key> indexes = (List<Key>) query.execute("Smith"); // List the child keys here
List<Key> keys = new List<Key>; // A place to store parent keys
for (Key k : indexes)
{
    keys.add(k.getParent()); // Here, how would getParent() know who it's parent is?
}

List <Message> messages = new List <Message>
for (Key k : keys)
{
    messages.add(pm.getObjectById(Message.class, k));
}

那么,在这个例子中,如何映射Message和MessageIndex之间的父子关系?我是否正确转换了Python代码?

非常欢迎任何意见/建议!

P.S。该视频的链接位于:http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html - &gt;非常有趣!

感谢。

1 个答案:

答案 0 :(得分:0)

没关系。我找到了另一种方法。每当我创建一个Message时,我都会使用相同的密钥创建MessageIndex。这样,MessageIndex始终与Message关联,因为它们共享相同的密钥。现在,我可以简单地从MessageIndex获取getKey()并在Message实体中使用getObjectById()来获取相应的消息。如果有人有比这更好的解决方案我会很感激,但是现在我会采用这种方法。不管怎样,谢谢。