我正在使用app引擎开发一个小后端。现在,在使用不同的值多次保存实体后,我得到了一些奇怪的行为。 我加载实体的代码对于所有实体都是相同的 - 每个实体都获得一个changeId,因此我只能将已更改的实体传输到客户端:
public class VersionableRecordHelper<T extends VersionableRecord> {
final Class<T> clazz;
public VersionableRecordHelper(Class<T> clazz) {
this.clazz = clazz;
}
Query<T> load() {
return ofy().load().type(clazz);
}
List<T> loadOrdered() {
return load().order("changeId").list();
}
public List<T> loadOrdered(Long since) {
return since == null ? loadOrdered() : load().filter("changeId >", since).order("changeId").list();
}
}
然后,客户端可以通过提供since
值来查询类的所有对象。例如:
private final VersionableRecordHelper<Cat> helper
= new VersionableRecordHelper<>(Cat.class);
// actually an @ApiMethod, simplified here
public List<Cat> getCats(Long since) {
return helper.loadOrdered(since);
}
我的Cat实体如下所示:
@Entity
@Cache
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS)
public class Cat extends VersionableRecord {
// some fields, getters, setters
}
public class VersionableRecord {
@Id
private String id;
@Index
private Long changeId;
// getters, setters and more
}
现在,如果我使用since == 4
执行相同的REST请求,我会得到完全不同的结果 - 有时使用changeId == 5,但也会使用2,3或4 - 哪些甚至不可能!
我完全迷失在这里。这是我检查过的:
since
的值不是空的。所以代码肯定会被执行。compile 'com.googlecode.objectify:objectify:5.0.3'
有没有人有一个有用的想法?我还检查了不同类型的实体 - 相同的行为。
答案 0 :(得分:2)
狂野猜测,这与FAQ#3相关:
或者,当googlecode去世时,第三个下来:
https://github.com/objectify/objectify/wiki/FrequentlyAskedQuestions
您需要安装ObjectifyFilter
,否则您会将会话数据泄露到后续请求中。升级到更新版本的Objectify;它会给你一个更明确的错误(以使测试和远程api使用复杂化为代价,但这是一个不同的故事)。
如果这不是您的问题,则需要更详细地描述您的确切代码。