无法使用objectify获取已保存的实体

时间:2013-05-18 16:48:07

标签: google-app-engine google-cloud-datastore objectify

我无法使用Objectify可靠地获取我保存的实体。

看起来缓存已损坏。奇怪的是 - 我可以通过管理控制台数据存储查看器正确地看到保存的实体。我还写了一个小程序来使用RemoteApi查看实体,我可以正确地看到保存的值。

当我使用servlet或云端点rest api连续查询实体时 - 我的连续查询给出了不同的结果,看起来数据存储区/缓存中的某些内容正在被破坏。

我的实体看起来像这样。

class ContentEntity {
  @Id Long id;
  String html;
  @Index String tag;
  boolean publish;
}

我这样保存。

ContentEntity entity = ofy().load.type(ContentEntity.class)
    .filter("tag", "my tag").first().get();

if (null == entity)
    entity = new ContentEntity();

entity.html = "my html";
entity.tag = "my tag";
entity.publish = true;

ofy().save.entity(entity).now();

我像这样挽回它。

ContentEntity entity = ofy().load().type(ContentEntity.class).
            filter("tag", "my tag").first().get();

发生的情况如下 -

1)让ContentEntity.html的初始值为“值1”
2)保存一个新值 - “值2”
3)使用管理控制台数据存储查看器我可以看到正确保存“值2”。 (使用远程api我也可以看到“值2”)
3)使用上面粘贴的检索代码通过servlet或rest api查看实体。我看到“价值2”
4)通过servlet或rest api再次查看实体。我看到“价值1”
5)再次查看。我看到“价值2”
它一直在“值1”和“值2”之间切换

这一切在我的开发环境中都运行良好,但没有在发动机环境中运行。

看起来我做错了什么并没有正确处理最终的一致性。我总是想要一致的结果。我不介意我的查询是否慢一点。我该怎么办?

非常感谢任何提示/建议/帮助。

此致

沙迪亚

1 个答案:

答案 0 :(得分:1)

事实证明这是因为我忘了在Objectify wiki page中提到的web.xml中添加objectify过滤器

我在web.xml中添加了以下内容,问题解决了。

<filter>
    <filter-name>ObjectifyFilter</filter-name>
    <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ObjectifyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

此致

沙迪亚