【问题标题】:How to update a datastore entity with Objectify?如何使用 Objectify 更新数据存储实体?
【发布时间】:2015-03-17 14:25:28
【问题描述】:

我使用 Google App Engine 数据存储,我需要更新一个已保存在其中的实体(我使用 Objectify 框架对数据存储执行操作)。 但是,我只需要更新实体的一个字段。 现在我加载(调用load())实体,使用getter/setter 来修改字段,然后调用save() 来持久化它。我确信有更好的方法。这样做的首选方法是什么?

【问题讨论】:

    标签: java google-app-engine objectify


    【解决方案1】:

    这是正常的方式。

    我猜您正在寻找类似 SQL 的 UPDATE? Google Datastore 没有这样的东西。更新和插入是相同的操作 - 您将实体作为键。

    参见文档:https://cloud.google.com/appengine/docs/java/datastore/entities#Java_Updating_an_entity

    【讨论】:

    • 需要说明的是,为了安全地进行更新,加载/保存必须在事务中进行。
    • 是的,这是个好主意。或捕获 ConcurrentModificationException 异常,并执行一些特定于域/代码的解决方法
    • 好的,谢谢您的回答。但是,每当我想更新某些东西时都需要交易吗?例如,假设我有一个 Book 实体和一个 int readings 字段,每次在 book 上执行 get() 操作时都会递增。这怎么会导致 ConcurrentModification Exception?
    • 如果其他请求对 db 进行了相同的更新,例如。也许用户点击了两次按钮,可能是因为应用程序逻辑中的一些错误。为什么实体在初始查询后更新的许多可能方式。如果您要更新的实体很少,事务非常有用,它不会锁定数据库,并且您仍然可以获得相同的异常
    • 这是不正确的。如果您在事务之外执行写入,您将看不到 CME - 数据存储对您隐藏任何争用。它的意思是“无论如何都写这个数据”,这可能会踩到加载和保存之间发生的其他写入。你需要一笔交易。此外,递增计数器本身就是一门完整的研究,对于这个评论字段来说太长了。
    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多