【问题标题】:GAE Objectify load object created in transaction within same transactionGAE Objectify 加载在同一事务中创建的对象
【发布时间】:2017-02-09 05:59:24
【问题描述】:

我尝试使用对象化事务,但是当我需要重新加载在同一事务中创建的对象时遇到了一些问题。

获取此示例代码

@Entity
public class MyObject
{
    @Parent
    Key<ParentClass> parent;

    @Index
    String foo;
}


ofy().transact(new VoidWork()
{
    @Override
    public void vrun()
    {
        ParentClass parent = load();// load the parent
        String fooValue = "bar";

        Key<ParentClass> parentKey = Key.create(ParentClass.class, parent.getId())
        MyObject myObject = new MyObject(parentKey);
        myObject.setFoo(fooValue);

        ofy().save().entity(myObject).now();

        MyObject reloaded = ofy().load().type(MyObject.class).ancestor(parentKey).filter("foo", fooValue).first().now();

        if(reloaded == null)
        {
            throw new RuntimeException("error");
        }
    }
});

我重新加载的对象始终为空,也许我错过了什么,但从逻辑上讲,在事务中我可以查询在同一事务中创建的对象?

谢谢

【问题讨论】:

    标签: java google-app-engine transactions objectify


    【解决方案1】:

    在这种特殊情况下,Cloud Datastore 与关系数据库不同。文档指出 -

    与大多数数据库不同,在 Cloud Datastore 中进行查询和获取 事务中看不到先前写入的结果 交易。具体来说,如果实体在 事务、查询或查找返回原始版本的 交易开始时的实体,或者如果 那时实体不存在。

    https://cloud.google.com/datastore/docs/concepts/transactions#isolation_and_consistency

    【讨论】:

    • 感谢您的回答,我希望 objectify 在事务上下文中使用本地缓存处理该问题,但显然 objectify 不会这样做..
    • 如果您在事务中进行了按键获取,Objectify 将为您提供您保存的对象(来自会话缓存)。但是,查询被提交到数据存储的查询处理器(无法满足来自会话缓存的查询),因此您会看到空结果集。
    • 这可以追溯到“将数据存储视为键值存储,并附加了一些额外的索引行为”。查询行为有一些怪癖。
    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多