[英]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
. 我有Entity1
和Entity2
,它们的管理器分别为NewQManager
和QAManager
以及服务QAService
和NewQService
。
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.