确定对象是否属于持久性管理器

时间:2011-12-08 04:55:31

标签: google-app-engine memcached jdo transient

我的具体问题(其他一切只是上下文,如果您知道我的问题的答案,可以忽略):如何使用JDO确定对象是否是瞬态的(或者我如何写一个简短的这样做的方法)?

对于那些好奇或不低估的人的背景,为什么我会想要这个:

我正在使用GAE / J上的JDO工作,目前我正在使用app引擎memcache api。我遇到了一个问题,我从我的数据存储区缓存了一个实体实例。在请求结束时,我的持久性管理器被关闭 - 据我所知,缓存的对象变得暂时(我可能错了)并在缓存中挂起。

在路上,缓存的对象用于构建我的视图等,但是当我去对对象进行更新并尝试并保持时;对象不会持久化(理所当然)。我正在通过在执行更新操作之前尝试重新获取缓存对象来解决此问题。但这引入了另一个问题,因为现在当我更新一个不会被缓存的对象时,它由我的持久性管理器管理,当我获取新对象时,我执行的任何更新操作都会被覆盖。基本上,我这样做....

// valueWithChangesToUpdate is an object that could be from 
// memcache or could be fresh from pm, don't know for sure
// going into the method
public <T extends SomeKindOfEntity> void update(CustomQueryClass q, T valueWithChangesToUpdate) {

  // If valueWithChangesToUpdate is not from memcache/not transient then
  // any changes made are overridden when the following statement executes

  T freshObject = q.runQuery();


  // What I would like to do to avoid problem I'm having...
  // T freshObject = null;
  // if(valueWithChangesToUpdate.isTransient()) {
  //   freshObject = q.runQuery();
  // }

  // End goal...
  freshObject.applyUpdates(valueWithChangesToUpdate);
  PMF.getCurrentPM().makepersistent(freshObject);
}

如果还有其他方法我应该尝试这样做,或者如果我正在考虑这个错误,请随意指出。

1 个答案:

答案 0 :(得分:1)

JDOHelper.getObjectState(obj);

明确地告诉你对象的状态。和

JDOHelper.getPersistenceManager(obj);

告诉您管理对象的PM(如果有的话)。文档可以在JDO规范或Apache JDO网站中找到。