Google Cloud Datastore - получить после вставки в один запрос - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь получить объект сразу после его сохранения. При отладке я вставляю сущность и проверяю сущности в облачной консоли Google, вижу, что она была создана.

Key key = datastore.put(fullEntity)

После этого я продолжаю получать сущность с

datastore.get(key)

, но ничего не возвращается. Как получить сохраненный объект в рамках одного запроса?

Я читал этот вопрос Отсутствующие объекты после добавления в Google Cloud DataStore , но я сохраняю только 1 объект, а не десятки тысяч, как в этом вопросе

Я использую Java 11 и Google DataStore (com.google.cloud.datastore. пакет) *

edit: добавлен код, каким был объект созданный

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)

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Я считаю, что с вашим кодом есть несколько проблем, но поскольку мы не можем увидеть логику c, стоящую за многими вашими методами, вот мое предположение.

Прежде всего, как вы может видеть документацию , можно сохранять и извлекать сущность в одном и том же коде, так что это не проблема.

Похоже, вы используете транзакцию, которая подходит для выполнить несколько операций за одно действие, но не похоже, что вы используете его правильно . Это потому, что вы только создаете его экземпляр и закрываете его, но не выполняете никаких операций с ним. Кроме того, вы используете this.datastore для сохранения в базе данных, которая полностью игнорирует транзакцию.

Таким образом, вы либо сохраняете объект, когда все его элементы уже добавлены, либо создаете транзакцию, чтобы сохранить все сущности сразу.

И я считаю, что вы должны использовать entityKey для того, чтобы впоследствии получить добавленную покупку, но не смешивайте ее.

Также вы создаете Transaction объект из this.datastore до его создания, но я предполагаю, что это ошибка копирования-вставки.

1 голос
/ 08 апреля 2020

Поскольку вы создаете транзакцию для этой операции, вставка сущности должна происходить внутри транзакции:

txn.put(builder.builder());

Кроме того, операции внутри l oop, где вы добавляете purchase.getItems ( ) к объекту newPurchase также следует выполнить в контексте той же транзакции.

Дайте мне знать, если это решит проблему.

Ура!

...