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

覆盖Google App Engine-Java中的数据存储实体,java,google-app-engine,google-cloud-datastore,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.setPropert

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

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

如果新实体的密钥与原始实体的密钥相同,则存储时将覆盖旧实体。

如果新实体的密钥与原始实体的密钥相同,则存储时将覆盖旧实体。

对于重写和现有实体,在按时间戳检索特定日志后,您可以使用
getKey()
方法获取此日志的密钥,然后使用此密钥和新的详细信息创建一个实体。现在,当您将此新实体放入数据存储时,它将使用相同的键替换先前的实体,以进行重写和现有实体,在按时间戳检索特定日志后,您可以使用
getKey()
方法获取此日志的键,然后使用此键和新的详细信息创建一个实体。现在,当您将此新实体放入数据存储时,它将用您编写的代码替换具有相同密钥的较早实体,您的数据存储中只有一个具有不断覆盖的密钥“Logkey”的日志实体

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

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

编辑:看起来您最终创建了一个嵌套实体,其中的数据来自具有相同键的新实体中的旧实体。只需重用从查询中收到的实体就容易得多

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

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

使用您编写的代码,您的数据存储中只有一个具有“Logkey”密钥的日志实体你一直在重写

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

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

编辑:看起来您最终创建了一个嵌套实体,其中的数据来自具有相同键的新实体中的旧实体。只需重用从查询中收到的实体就容易得多

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

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

这是同一个密钥。它存储在同一实体中,但作为实体中的新对象。如何编辑旧实体条目?如何知道其未被覆盖?如何查看多个实体?真相的来源(在dev服务器上)在/_ah/adminIt,它是相同的密钥。它存储在同一实体中,但作为实体中的新对象。如何编辑旧实体条目?如何知道其未被覆盖?如何查看多个实体?真相的来源(在dev服务器上)位于/_ah/administration。此代码创建具有相同属性的新实体,但将其作为新的日志条目,而不是覆盖旧的日志条目。编辑此代码以显示执行此操作的正确方法。您不需要创建新实体。已澄清问题。此代码创建具有相同属性的新实体,但将其作为新的日志条目,而不是覆盖旧的日志条目。编辑此代码以显示执行此操作的正确方法。您不需要创建新实体。谢谢!我将新实体设置为
实体编辑\u log=新实体(键)getKey()
方法中的my key变量编写>代码。谢谢!我将新实体设置为
实体编辑\u log=新实体(键)getKey()
方法中的my key变量编写>代码。