【问题标题】:Accessing an custom class from a JDO Class从 JDO 类访问自定义类
【发布时间】:2011-01-06 04:59:17
【问题描述】:

是的,我不知道我是不是完全看错了树 - 我发现 JDO 和 Google AppEngine 有点难以掌握。不管怎样,就这样吧。

我有一个包含另一个类作为其内部变量之一的类(参见 player1)

  @PersistenceCapable(identityType = IdentityType.APPLICATION)
   public class JDOGame 
   {    
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent
    private String map; 

    @Persistent
    private RPCDataPlayer player1;

   // getters, setters, constructors etc...
   }

RPCDataPlayer 类是可序列化的,非常基础......

public class RPCDataPlayer implements IsSerializable 
{
    public String name;
    public int id;

        // getters & setters & constructors oh my

        public int getId() { return id; }
}

所以,我的问题是...如何创建一个查询,在其中可以获取所有包含 id = x 的 RPCDataPlayer 的 JDOGames?

我无法进行类似...的查询

SELECT FROM JDOGame.class.getName() WHERE player1.getId() == x

...那么人们有什么技术或建议来实现这一点?

提前致谢。

【问题讨论】:

  • 我认为它可能工作的唯一方法是从数据存储中获取所有 JDOGame 实例,然后遍历它们——但这似乎不是特别有效:(

标签: google-app-engine gwt jdo google-cloud-datastore


【解决方案1】:

您的字段在数据存储中是序列化的,因此您显然无法在数据存储中进行查询,因此所有这些记录都需要检索并且查询在内存中进行。当 GAE/J 最终齐心协力并允许人们这样做时,这将是微不足道的,在此之前您需要自己检索所有记录并进行检查。

与连接无关

【讨论】:

  • 谢谢你,我觉得这应该是可能的。我会按照上面的方法做,等待我的时间......
【解决方案2】:

Google App Engine 数据库不是关系数据库,因此您无法进行联接。您可以将 RPCDataPlayer 持久化为表。

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class RPCDataPlayer {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent(mappedBy = "player1")
    private List<JDOGame> jdoGames = new ArrayList<JDOGame>();

    @Persistent
    public String name;

    @Persistent
    public int id;

    public int getId() {
        return id;
    }

    public Key getKey() {
        return key;
    }

    public void setJdoGames(List<JDOGame> jdoGames) {
        this.jdoGames = jdoGames;
    }

    public List<JDOGame> getJdoGames() {
        return jdoGames;
    }

}

然后你就可以这样查询了。

SELECT FROM RPCDataPlayer.class.getName() WHERE id == x

一旦你有了 RPCDataPlayer 的实例,你就可以通过调用来获取 JDOGame:

List<JDOGame> jdoGames = rpcDataPlayer.getJdoGames();

【讨论】:

  • 感谢 Kodova,但我不太确定这将如何工作。每个游戏都有一个玩家,但一个玩家可以是许多游戏的一部分。如果我添加第二个玩家,叫做 player2 会怎样?抱歉不清楚。
  • 使用更新后的代码,您可以为玩家撤回所有游戏。如果添加玩家,您可以添加 player2 也 JDOGame 并在 PRCDataPlayer 中复制 jdoGames 并合并两个列表。更好的方法是创建一个包含 JDOGame、RCPDataPlayer 和 playerNumber 的连接表。这需要多对多关系,您可以在此处阅读 code.google.com/appengine/docs/java/datastore/…
  • 嗯,对了 - 谢谢 Kodova,我现在明白了。它让我远离关系数据库,这是一个棘手的问题!
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2017-06-11
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多