【问题标题】:Determine if object belongs to persistence manager or not确定对象是否属于持久性管理器
【发布时间】:2012-01-15 14:44:15
【问题描述】:

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

那些好奇或不明白我为什么想要这个的人的上下文:

我正在使用 JDO 开发 GAE/J,目前正在实施应用引擎 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);
}

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

【问题讨论】:

    标签: google-app-engine memcached jdo transient


    【解决方案1】:
    JDOHelper.getObjectState(obj);
    

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

    JDOHelper.getPersistenceManager(obj);
    

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

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多