Google Cloud Datastore - 在一个请求中插入后获取

Google Cloud Datastore - get after insert in one request

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

Key key = datastore.put(fullEntity)

之后,我继续使用

获取实体
datastore.get(key)

,但没有返回任何内容。如何在一次请求中检索保存的实体?

我读过这个问题 但我只保存了 1 个实体,而不是那个问题中的数万个

我正在使用 Java 11 和 google 数据存储(com.google.cloud.datastore. 包)*

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

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

之后,我将尝试检索创建的实体

Key key = create(...);
Entity e = datastore.get(key)

由于您为此操作创建了一个事务,因此放置的实体应该发生在该事务中:

txn.put(builder.builder());

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

如果这能解决问题,请告诉我。

干杯!

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

首先,正如您在 the documentation 上看到的那样,可以在同一代码上保存和检索实体,所以这不是问题。

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

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

而且我认为您应该使用 entityKey 以便之后获取添加的购买,但不要混用。

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