Google cloud platform 谷歌云数据存储-在一个请求中插入后获取

Google cloud platform 谷歌云数据存储-在一个请求中插入后获取,google-cloud-platform,google-cloud-datastore,Google Cloud Platform,Google Cloud Datastore,我正在尝试在保存实体后立即检索该实体。调试时,我插入实体,并在谷歌云控制台中检查实体,我看到它被创建了 Key key = datastore.put(fullEntity) 之后,我继续使用 datastore.get(key) ,但没有返回任何内容。如何在一个请求中检索保存的实体 我读过这个问题 但我只保存了一个实体,而不是像那个问题中那样保存了成千上万个实体 我正在使用Java11和google数据存储(com.google.cloud.datastore.package)* 编辑:添

我正在尝试在保存实体后立即检索该实体。调试时,我插入实体,并在谷歌云控制台中检查实体,我看到它被创建了

Key key = datastore.put(fullEntity)
之后,我继续使用

datastore.get(key)
,但没有返回任何内容。如何在一个请求中检索保存的实体

我读过这个问题 但我只保存了一个实体,而不是像那个问题中那样保存了成千上万个实体

我正在使用Java11和google数据存储(com.google.cloud.datastore.package)*

编辑:添加了如何创建实体的代码

public Key create.... {
    // creating the entity inside a method
    Transaction txn = this.datastore.newTransaction();

    this.datastore = DatastoreOptions.getDefaultInstance().getService();
    Builder<IncompleteKey> builder = newBuilder(entitykey);

    setLongOrNull(builder, "price", purchase.getPrice());
    setTimestampOrNull(builder, "validFrom", of(purchase.getValidFrom()));
    setStringOrNull(builder, "invoiceNumber", purchase.getInvoiceNumber());
    setBooleanOrNull(builder, "paidByCard", purchase.getPaidByCard());

    newPurchase = entityToObject(this.datastore.put(builder.build()));
    if (newPurchase != null && purchase.getItems() != null && purchase.getItems().size() > 0) {
        for (Item item : purchase.getItems()) {
            newPurchase.getItems().add(this.itemDao.save(item, newPurchase));
        }
    }
    txn.commit();
    return newPurchase.getKey();
}

因为您正在为此操作创建事务,所以实体put应该发生在事务内部:

txn.put(builder.builder());
此外,将purchase.getItems()添加到newPurchase对象的循环中的操作也应该在同一事务的上下文中完成

让我知道这是否解决了问题


干杯

因为您正在为此操作创建一个事务,所以实体put应该发生在事务内部:

txn.put(builder.builder());
此外,将purchase.getItems()添加到newPurchase对象的循环中的操作也应该在同一事务的上下文中完成

让我知道这是否解决了问题


干杯

我相信您的代码存在一些问题,但由于我们无法看到您的许多方法背后的逻辑,因此我猜是这样的

首先,正如您在上所看到的,可以在同一代码中保存和检索实体,因此这不是问题

看起来您正在使用一个事务,该事务可以在一个操作中执行多个操作,但您似乎不是这样。这是因为您只实例化它并关闭它,但没有对其进行任何操作。此外,您正在使用
this.datastore
保存到数据库,这完全忽略了事务

因此,您可以在对象的所有项目都已添加时保存该对象,也可以创建一个事务来一次性保存所有实体

我相信您应该使用
entityKey
来获取以后添加的购买,但不要混用


另外,在实例化this.datastore之前,您正在从this.datastore创建
Transaction
对象,但我假设这是一个复制粘贴错误。

我认为您的代码存在一些问题,但由于我们无法看到许多方法背后的逻辑,所以我猜是这样的

首先,正如您在上所看到的,可以在同一代码中保存和检索实体,因此这不是问题

看起来您正在使用一个事务,该事务可以在一个操作中执行多个操作,但您似乎不是这样。这是因为您只实例化它并关闭它,但没有对其进行任何操作。此外,您正在使用
this.datastore
保存到数据库,这完全忽略了事务

因此,您可以在对象的所有项目都已添加时保存该对象,也可以创建一个事务来一次性保存所有实体

我相信您应该使用
entityKey
来获取以后添加的购买,但不要混用


在实例化后者之前,您正在从
this.datastore
创建
Transaction
对象,但我假设这是一个复制粘贴错误。

您可以添加用于创建实体的代码和变量
datastore
的声明吗?我相信您的问题与您的
get
请求有关,但我需要确认。@Ajordat我添加了代码。恐怕此代码与最初提供的示例有很大不同,我现在对根本原因有疑问。您能在检索添加实体的位置添加行吗?@Ajordat现在呢?我添加了更多的代码。它只是对一个方法的调用,该方法返回我用于检索新创建的实体的键。有两门课,如果有帮助的话。。。服务调用dao来创建,然后在服务中我尝试检索创建的实体是否可以添加用于创建实体的代码以及变量
数据存储的声明?我相信您的问题与您的
get
请求有关,但我需要确认。@Ajordat我添加了代码。恐怕此代码与最初提供的示例有很大不同,我现在对根本原因有疑问。您能在检索添加实体的位置添加行吗?@Ajordat现在呢?我添加了更多的代码。它只是对一个方法的调用,该方法返回我用于检索新创建的实体的键。有两门课,如果有帮助的话。。。服务调用dao来创建,然后在服务中我尝试检索创建的实体请注意,我们无法进一步帮助您,因为提供的代码使用了许多方法和对象,但它们有一个定义,因此我们只能猜测,例如,
entityToObject
this.itemDao.save
。如果这不能解决您的问题,我建议您提供一个更干净的代码版本,该版本完全且仅显示数据存储库中的方法或操作。请注意,我们无法进一步帮助您,因为提供的代码使用了许多方法和对象,但它们有一个定义,因此我们只能猜测,例如,
entityToObject
this.itemDao.save
。如果这不能解决您的问题,我建议您提供一个更干净的代码版本,该版本完全且仅显示数据存储库中的方法或操作。