Java GAE,JDO:如何缓存没有父实体的父实体&x27;孩子们

Java GAE,JDO:如何缓存没有父实体的父实体&x27;孩子们,java,google-app-engine,google-cloud-datastore,jdo,Java,Google App Engine,Google Cloud Datastore,Jdo,我有一个问题,每当我加载父实体(User,在我的例子中)并将其放入缓存时,它的所有子实体(在拥有的关系中)也会被缓存 如果我没有弄错的话,解释很简单:序列化过程涉及对象的所有属性,这导致所有子对象也被获取。最后,获取整个实体组 我如何避免这种情况?用户实体组计划包含相当多的信息,我不想一次缓存所有信息。更不用说一次获取所有子对象的要求非常高 我遇到了transient修饰符,我很高兴有一段时间,直到我意识到,它不仅阻止了某些字段被缓存,还阻止了这些字段被持久化 因此答案是使用实体的分离版本。我使

我有一个问题,每当我加载父实体(
User
,在我的例子中)并将其放入缓存时,它的所有子实体(在拥有的关系中)也会被缓存

如果我没有弄错的话,解释很简单:序列化过程涉及对象的所有属性,这导致所有子对象也被获取。最后,获取整个实体组

我如何避免这种情况?用户实体组计划包含相当多的信息,我不想一次缓存所有信息。更不用说一次获取所有子对象的要求非常高


我遇到了
transient
修饰符,我很高兴有一段时间,直到我意识到,它不仅阻止了某些字段被缓存,还阻止了这些字段被持久化

因此答案是使用实体的分离版本。我使用一个函数加载所有实体,该函数现在看起来如下所示:

@SuppressWarnings("unchecked")
E cachedEntity = (E) cache.get(cacheKey);

if (cachedEntity != null) {
    entity = cachedEntity;          
}
else {
    entity = pm.getObjectById(Eclass, key);
    cache.put(cacheKey, pm.detachCopy(entity));
}
缺点是,当我想要获取子对象时,我必须使用
entity=pm.makePersistent(entity)
显式地将实体附加回来,它生成
Datastore.get
RPC。然而,这种情况并不经常发生,我很可能只是想访问实体本身,而不是它的子对象,因此它非常有效


我找到了一个更好的解决办法。附加实体时的一个RPC调用就在那里,因为JDO检查该实体是否真的存在于数据存储中。根据DataNucleus文档,只需在PMF中将
DataNucleus.attachSameDatastore
设置为
false
即可关闭此功能。但是,它对我不起作用,
Datastore.GET
在附加对象时总是被调用。如果它能工作,我可以在从缓存中获取每个对象之后以零成本隐式地附加它,而不必在需要时手动执行该操作。

您是否使用这里描述的DataNucleus二级缓存?或者您是在使用JCache或类似的工具实现自己的缓存逻辑?是的,正如您在我的示例中所看到的,我正在使用JCache实现自己的缓存逻辑。但内部DataNucleus二级缓存似乎会更好更简单地使用。。。我希望我以前就知道这件事。。。另一方面,我读了关于DataNucleus二级缓存的文档,但我对一些事情不太确定。。。更新对象时会发生什么情况?还是使用查询删除?它会被删除/更新吗?是否保证我始终获得对象的最新版本?