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
对象,但我认为这是一个复制粘贴错误。
我正在尝试在实体保存后立即检索它。调试时,我插入实体,并在 google 云控制台中检查实体,我看到它已创建。
Key key = datastore.put(fullEntity)
之后,我继续使用
获取实体datastore.get(key)
,但没有返回任何内容。如何在一次请求中检索保存的实体?
我读过这个问题
我正在使用 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
对象,但我认为这是一个复制粘贴错误。