【发布时间】:2014-10-25 22:23:34
【问题描述】:
直接举例:
@Entity
public class Parentt {
@Id
String id;
}
@Entity
public class Child {
@Parent
Ref<Parentt> parenttRef;
@Id
String id;
}
public void test() {
final Parentt parentt = new Parentt();
ofy().transact(new VoidWork() {
@Override
public void vrun() {
parentt.setId(UUID.randomUUID().toString());
ofy().save().entity(parentt).now();
Child child = new Child();
child.setId(UUID.randomUUID().toString());
child.setParentt(parentt.getId());
ofy().save().entity(child).now();
LOG.info("query result size: " + ofy().load().type(Child.class).ancestor(parentt).list().size());
ofy().flush();
LOG.info("query result size: " + ofy().load().type(Child.class).ancestor(parentt).list().size());
}
});
LOG.info("query result size(outside of transaction): " + ofy().load().type(Child.class).ancestor(parentt).list().size());
}
test()方法内部代码生成的结果:
query result size: 0
query result size: 0
query result size(outside of transaction): 1
我在 Objectify 文档中找到:
低级 API 有一些怪癖:例如,get()s 和 query()s 将看到数据存储“及时冻结”并且不会反映 甚至在事务中更新。 Objectify 隐藏了这种行为 来自你;随后的提取将看到相同的数据(或更新) 之前。请注意,由于查询总是在 GAE 内部运行, 索引(即过滤操作)似乎总是及时冻结 - Objectify 无法隐藏这一点。
祖先查询是否基于内部索引,这就是查询在事务内部不返回结果的原因(这里除了父查询之外没有其他过滤)?
【问题讨论】:
标签: java google-cloud-datastore objectify