Определите, принадлежит ли объект диспетчеру сохраняемости или нет - PullRequest
1 голос
/ 08 декабря 2011

Мой конкретный вопрос (все остальное - просто контекст, и его можно игнорировать, если вы знаете ответ на мой вопрос): Как определить, является ли объект временным или нет, используя 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);
}

Если есть какой-то другой способ, которым я должен пытаться сделать это, или если я думаю об этом неправильно, пожалуйста, не стесняйтесь указывать на это.

1 Ответ

1 голос
/ 08 декабря 2011
JDOHelper.getObjectState(obj);

точно сообщает вам состояние объекта. И

JDOHelper.getPersistenceManager(obj);

сообщает вам PM, управляющий объектом (если есть). Документацию можно найти в спецификации JDO или на веб-сайте Apache JDO.

...