所以我现在已经坚持了这个问题大约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 ......好笑......所以这是我的最后一招:)
谢谢!
答案 0 :(得分:1)
尽管有正当理由将您的关系表示为实体“一方”的列表,但更常见的方法是让“多”方的实体在'一方'上引用该实体。 '边。也就是说,不是每个Pool都有一个玩家列表,而是每个玩家都应该引用它所属的单个游泳池。
你有没有采取这种方法的原因?你试过吗?