Как указать значение по умолчанию для поля в объекте JDO в appengine? - PullRequest
3 голосов
/ 10 декабря 2010

Я недавно добавил текстовое поле в одну из моих сущностей, которая не может быть нулевой.Я хотел бы установить для него значение по умолчанию, чтобы все сущности, которые я сохранил до добавления поля, будут заполнены пустой строкой.Это возможно с JDO?

1 Ответ

2 голосов
/ 07 января 2011

Да, хотя не так тривиально, как вы, вероятно, ожидали.

Ограничения

  1. Будет время ожидания, если оно занимает более 30 секунд , если вы не запустите его как задачу, в которой на случай, если время ожидания будет более 10 минут .
  2. Нет более разумного способа получить только сущности, которые необходимо обновить с Вы не можете запросить свойство, которое не существует .

Обходные пути

  1. Вы захотите заглянуть в проект appengine-mapreduce до получить реализацию, которая может в комплекте более 10 минут время настенных часов.
  2. Неизвестно.

Код

void updateNullBarField() {
  final Text DEFAULT_BAR = new Text("bar");

  PersistenceManagerFactory pmfInstance = JDOHelper
    .getPersistenceManagerFactory("transactions-optional");
  PersistenceManager pm = pmfInstance.getPersistenceManager();
  Query query = pm.newQuery(Foo.class);
  @SuppressWarnings("unchecked")
  Collection<Foo> foos = pm.detachCopyAll((List<Foo>) query.execute());

  for (Foo foo : foos) {
    if (foo.bar == null) {
      foo.bar = DEFAULT_BAR;
      pm.detachCopy(pm.makePersistent(foo));
    }
  }
}
...