覆盖Google App Engine-Java中的数据存储区实体

时间:2013-07-18 14:14:56

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

我有一个应用程序,我想覆盖一个单独的实体。这就是我最初创建实体日志的方式:

Entity log = new Entity("Log", "Logkey");
    String property1 = req.getParameter("property1");
    String property2 = req.getParameter("property2");
    log.setProperty("property1", property1);
    log.setProperty("property2", property2);
    datastore.put(log);

以下是如何检索实体日志以进行覆盖:

Query query = new Query("Log", "Logkey")
             .setFilter(timeStampFilter);
List<Entity> logs = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(1));  
request.setAttribute("logs", logs);

并发送到jsp表单页面value="${log.properties.property1}",应该覆盖它们。然后使用POST方法将此条目发送到第二个servlet,并将其作为参数请求,与之前的代码一样,但保存为具有相同类型的新实体:

Entity edit_log = new Entity("Log", "Logkey");
        String property1 = req.getParameter("property1");
        String property2 = req.getParameter("property2");
        edit_log.setProperty("property1", property1);

3 个答案:

答案 0 :(得分:2)

对于重写和现有实体,在按时间戳检索特定日志后,您可以使用getKey()方法获取此日志的密钥,然后使用此密钥和新详细信息创建实体。现在,当您将此新实体放入数据存储区时,它将使用相同的键

替换之前的实体

答案 1 :(得分:2)

使用您编写的代码,您的数据存储区中只有一个Log实体,其中包含您经常覆盖的“Logkey”键。

如果您正在使用其他代码来检索实体并重写它们,那么您需要显示其他代码。否则,这个问题编写得很糟糕,因为给出的代码已经描述了你想要做的事情(总是覆盖同一个实体)。

如果您在其他地方创建/保存实体的代码,最好也显示它。

编辑:您最终会在具有相同密钥的新实体中使用旧实体中的数据创建嵌套实体。重复使用从查询中收到的实体要容易得多。

log = logs.get(0)
log.setProperty("property1", req.getParameter("property1");
log.setProperty("property2", req.getParameter("property2");
datastore.put(log);

此外,由于您实际上知道密钥(“Logkey”),因此您不需要发出数据存储区查询,您只需按键获取实体 - 这很好,因为您可以解决最终一致性行为。 / p>

答案 2 :(得分:0)

如果您的新实体与原始实体具有相同的密钥,那么当您存储它时,它将覆盖旧实体。