添加到google-appengine中的集合

时间:2011-03-29 07:21:24

标签: google-app-engine collections persistence jdo entities

所以我现在已经坚持了这个问题大约3周了。我读过这个:http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html但它似乎没有成功。基本上我有一个持久对象,称为池,我需要将玩家添加到此池中。玩家也是持久对象。我在游泳池和玩家之间存在无关联,游泳池中有一组玩家ID(primaryKey ID ......)

所以我尝试过的事情: 1)我用Long作为两者的主键,这没用。 2)尝试使用来自appengine的Key作为主键,这不起作用,因为你不能在客户端使用Key的实现。我找到的解决方法都没有工作,数据传输对象是草率/凌乱/错误/ hackish和各种坏事。 3)尝试使用字符串作为id,就像这样......

@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String id;

这也不起作用。当我尝试在其集合中添加字符串时,就像这样......

public void addPlayers(Pool pool, List<String> players) {
    PersistenceManager pm = getPersistenceManagerFactory().getPersistenceManager();

    try {
        pm.currentTransaction().begin();
        Pool oldPool = pm.getObjectById(Pool.class, pool.getID());
        for(String id : players) {
            oldPool.addPlayer(id);
            System.out.println("Added id:" + id);
        }
        pm.currentTransaction().commit();
    } catch (Exception e) {
        pm.currentTransaction().rollback();
        e.printStackTrace();
    } finally  {
        pm.close();
    }

}

它将无声地失败。就像在......它只是没有坚持下去。

任何建议都会很棒。这是一个学校项目,所以不幸的是我被迫使用JDO在GWT中完成。我的教授和TA都无法帮助我,因为他们不熟悉GWT ......好笑......所以这是我的最后一招:)

谢谢!

1 个答案:

答案 0 :(得分:1)

尽管有正当理由将您的关系表示为实体“一方”的列表,但更常见的方法是让“多”方的实体在'一方'上引用该实体。 '边。也就是说,不是每个Pool都有一个玩家列表,而是每个玩家都应该引用它所属的单个游泳池。

你有没有采取这种方法的原因?你试过吗?