2

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

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);
4

3 回答 3

2

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

于 2013-07-18T19:00:10.237 回答
2

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

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

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

编辑:看起来您最终使用相同键的新实体中的旧实体中的数据创建了一个嵌套实体。重用从查询中收到的实体要容易得多。

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

此外,由于您实际上知道密钥(“Logkey”),因此您不需要发出数据存储查询,您可以通过密钥获取实体 - 这很好,因为您可以绕过最终一致性行为。

于 2013-07-18T22:45:23.993 回答
0

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

于 2013-07-18T17:42:33.603 回答