我有这个代码在没有 HR 的情况下工作得很好:
protected Entity createEntity(Key key, Map<String, Object> props){
Entity result = null;
try {
Entity e = new Entity(key);
Iterator it = props.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next();
String propName = entry.getKey();
Object propValue = entry.getValue();
setProperty(e, propName, propValue);
}
key = _ds.put(e);
if (key != null)
result = _ds.get(key);
} catch (EntityNotFoundException e1) {
}
return result;
}
这只是一个简单的方法,它的功能是创建一个新的Entity
out aa given key
,否则返回 NULL 。如果没有 JUnit 中的 HR 配置,这可以正常工作,但是当我配置它时,我总是收到一个错误,在哪里_ds.get(key)
找不到键抛出:
EntityNotFoundException: No entity was found matching the key:
具体做的时候:
while(it.hasNext()){
// stuff
createEntity(key, map);
// stuff
}
我认为我的代码中的问题是它试图过早地获取实体。如果是这样的话,我怎么能不诉诸Memcache
或类似的东西来处理这个问题。
更新:
在createEntity
事务中执行时,它会失败。但是,如果我在交易之外删除它,如果失败得很惨。我需要能够在事务中运行,因为我的更高级别的 API 将许多需要作为一个组存在的对象。
更新:
我听从了 Strom 的建议,但是我发现了一个奇怪的副作用,而不是_ds.get(key)
对方法进行操作,这让我PreparedQuery
countEntities
失败了。如果添加一个_ds.get(key)
甚至我不做任何事情或保存Entity
从那个得到的countEntities
回报返回预期的计数。这是为什么?