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

发布于 2024-10-07 08:54:29 字数 79 浏览 1 评论 0原文

我最近将文本字段添加到不能为空的实体之一。我想为其设置一个默认值,以便在添加该字段之前存储的所有实体都将填充空字符串。这可以用 JDO 实现吗?

I recently added Text field to one of my Entities that cannot be null. I'd like to set a default value for it, so that all of the Entities that I stored before I added the field will be populated with an empty string. Is this possible with JDO?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

滥情哥ㄟ 2024-10-14 08:54:29

是的,尽管并不像您想象的那么微不足道。

限制

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

Yes, though not as trivially as you were probably expecting.

Limitations

  1. Will time out if it
    takes more then 30 seconds
    ,
    unless you run it as a task, in which
    case it will time out if it takes
    more then 10 minutes
    .
  2. There's no smarter way to get only
    the entities that need updated since
    you can't query on a property that
    doesn't exist
    .

Workarounds

  1. You'll want to look into the
    appengine-mapreduce project to
    get an implementation that can
    complete with more then 10 minutes
    wall-clock time.
  2. None known.

Code

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));
    }
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文