我正在尝试使用以下代码添加新的根实体:
try {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Key eventKey = datastore.allocateIds("Event", 1).getStart();
String keyString = KeyFactory.keyToString(eventKey);
//TransactionOptions options = TransactionOptions.Builder.withXG(true);
Transaction txn = datastore.beginTransaction();
Entity eventEntity = new Entity("Event", keyString);
datastore.put(eventEntity);
txn.commit();
} catch (Exception e) {
log.log(Level.SEVERE, e.getMessage(), e);
throw new InternalServerErrorException(e);
}
这是一个简单的事务数据存储区插入,根据documents假设工作 -
每个根实体属于一个单独的实体组,因此单个事务不能在多个根实体上创建或操作,除非它是XG事务
我的'事件'实体没有任何祖先我只在交易中处理它。但由于某种原因,我得到以下例外:
java.lang.IllegalArgumentException:需要显式指定跨组事务,请参阅TransactionOptions.Builder.withXGfound和Element { 类型:“事件” id:4 } 和元素{ 类型:“事件” 名称:“ahBldmVudHNmaW5kZXIyMDEzcgsLEgVFdmVudBgEDA” }
这里有什么想法吗?
答案 0 :(得分:0)
您的代码对我有用。我将它粘贴到一个运行的简单应用程序的中间,运行它两次,它创建了两个“事件”实体,并没有抛出任何异常。您的应用程序在其他地方有问题。
答案 1 :(得分:0)
好的,问题是因为我在交易中调用了以下方法:
private boolean containsEvent(Key eventKey) {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
boolean contains = true;
try {
if (eventKey == null) {
return false;
}
Entity eventEntity = datastore.get(eventKey);
if (eventEntity == null) {
contains = false;
}
} catch (com.google.appengine.api.datastore.EntityNotFoundException e) {
contains = false;
}
return contains;
}
此代码仅检查数据存储区中是否已存在此实体 显然,由于实体尚未提交,因此将其视为获取不同的根实体,从而使其成为XG操作。一旦我在交易之外移动此方法调用,一切正常。