简体   繁体   English

如何使用Objectify在Google Cloud Plateform中的多个实体上使用交易?

[英]How to use transaction on more than one entities in Google Cloud Plateform using Objectify?

I have Entity1 and Entity2 , their Manager respectively NewQManager and QAManager and Services QAService and NewQService . 我有Entity1Entity2 ,它们的管理器分别为NewQManagerQAManager以及服务QAServiceNewQService
What I want to do : I want to remove Question from Entity1 and add it to Entity2 in a single transaction, for that, I am using Objectify services in AbstractTransaction class which is extended by QAService . 我想做的事情 :我想从Entity1删除Question并在单个事务中将它添加到Entity2中,为此,我在AbstractTransaction类中使用Objectify服务,该类由QAService扩展。 However, I am getting the following error: 但是,我收到以下错误:

java.lang.IllegalArgumentException: operating on too many entity groups in a single transaction.

QuestionManager.java QuestionManager.java

QAService.getInstance().implementTransaction(
        repo -> {
        NewQManager.getInstance().remove(question);
        QAManager.getInstance().addOrUpdateItem(question);
            return true;
        });

QAService.java QAService.java

public class QAService extends AbstractTransaction {
    public static QAService getInstance() {
        if (instance != null)
            return instance;

        instance = new QAService();
        return instance;
    }
}

AbstractTransaction.java AbstractTransaction.java

public class AbstractTransaction<T, ID> {

    public <A> A implementTransaction(Function<AbstractTransaction<T, ID>, A> operations) {
        return ofy().transact(() -> operations.apply(this));
    }

    public T save(T entity) {
        ofy().save().entity(entity).now();
        return entity;
    }
}

Error 错误

    java.lang.IllegalArgumentException: operating on too many entity groups in a single transaction.
        at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:52)
        at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:135)
        at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:109)
        at com.google.appengine.api.datastore.Batcher$ReorderingMultiFuture.get(Batcher.java:115)
        at com.google.appengine.api.datastore.FutureHelper$TxnAwareFuture.get(FutureHelper.java:186)
        at com.googlecode.objectify.cache.TriggerFuture.get(TriggerFuture.java:100)
        at com.googlecode.objectify.impl.ResultAdapter.now(ResultAdapter.java:34)
        at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22)
        at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10)
        at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
        at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
        at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22)
        at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10)
        at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
        at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
com.vivoiz.healofy.backend.commonServices.services.AbstractTransaction.save(AbstractTransaction.java:44)

All this AbstractTransaction stuff looks weird and the extra complexity is probably hiding what you are doing. 所有这些AbstractTransaction东西看起来都很奇怪,而且额外的复杂性可能隐藏了您正在做的事情。

One of the fundamental limits of the datastore is you can only enlist 25 entity groups in a single transaction. 数据存储区的基本限制之一是您只能在一个事务中加入25个实体组。 Somehow you are doing that, possibly by @Load groups - it's impossible to tell from what you've posted. 您可能通过@Load组以某种方式这样做-从您发布的内容中看不出来。

The solution is "load less stuff in your transaction". 解决的办法是“减少交易中的东西”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM