使用Objectify和GAE不保存的对象

时间:2013-02-01 17:42:09

标签: google-app-engine loading objectify

我正在尝试保存一个对象,并确认它刚刚保存,但它似乎没有工作。

这是我的对象

import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;

@Entity
public class PlayerGroup {
    @Id public String n;//sharks
    public ArrayList<String> m;//members [39393,23932932,3223]

}

以下是保存然后尝试加载的代码。

        playerGroup = new PlayerGroup();
        playerGroup.n = reqPlayerGroup.n;
        playerGroup.m = reqPlayerGroup.m;
        ofy().save().entity(playerGroup).now();
        response.i = playerGroup;
        PlayerGroup newOne = ofy().load().type(PlayerGroup.class).id(reqPlayerGroup.n).get();

但是“newOne”对象为null。即使我完成了保存它。我做错了什么?

- Update-- 如果我稍后尝试(比如几分钟之后),有时候我会看到这个对象,但是在保存后却没有。这是否与高复制存储有关?

1 个答案:

答案 0 :(得分:7)

前段时间有相同的行为,并在google groups上提出问题 - 客观化

我得到了答案:

You are seeing the eventual consistency of the High-Replication 
Datastore.  There has been a lot of discussion of this exact subject 
on the Objecify list in google groups , including several links to the 
Google documentation on the subject. 

Basically, any kind of query which does not include an ancestor() may 
return results from a stale view of the datastore. 

Jeff 

我还有另一个很好的答案来处理行为

  

对于删除,查询键然后批量获取实体。确保   你的获取被设置为强一致性(虽然我相信这是   默认)。对于已删除的实体,batch-get应返回null。   添加时,它会变得有点棘手。索引更新可能需要一些时间   秒。 AFAIK,有三种方法可以解决这个问题:1;使用预先计算   结果(完全避免查询)。如果您的下一个视图是用户的   最近创建的实体,在用户中保留这些键的列表   实体,并在创建新实体时更新该列表。那份清单   永远是新鲜的,不需要查询。除了避免陈旧   索引,这也加快了你的应用程序。你的结果就越多   可以可靠地管理,您可以避免的查询越多。

     

2;通过最近使用“增强”查询结果来隐藏延迟   添加实体。根据您添加实体的速率,   要么只注入最新的密钥,要么将其与   1中的解决方案。

     

3;通过让用户浏览一些未受影响的视图来隐藏延迟   登陆基于查询的视图之前。这个策略肯定有   闻到它的味道。您需要确保这些额外步骤是相关的   给用户,或者你会给你一个糟糕的经历。

     

蝴蝶,Joakim

你可以在这里阅读:

How come If I dont use async api after I'm deleting an object i still get it in a query that is being done right after the delete or not getting it right after I add one


类似问题的另一个好答案Objectify doesn't store synchronously, even with now