如何为appengine上的JDO实体中的字段指定默认值?

时间:2010-12-09 22:15:41

标签: java google-app-engine jdo

我最近将Text字段添加到我的某个不能为null的实体中。我想为它设置一个默认值,这样我添加字段之前存储的所有实体都将填充一个空字符串。 JDO可以实现吗?

1 个答案:

答案 0 :(得分:2)

是的,虽然不像你想象的那样琐碎。

限制

  1. time out if it takes more then 30 seconds, 除非你把它作为一个任务运行,其中 如果它time out if it takes more then 10 minutes
  2. 没有更聪明的方法可以获得 需要更新的实体 你can't query on a property that doesn't exist
  3. 变通办法

    1. 你想看看 appengine-mapreduce project来 得到一个可以实现的实现 完成超过10分钟 挂钟时间。
    2. 没有人知道。
    3. 代码

      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));
          }
        }
      }