8

我在我的实体中使用Longid,不仅将它们存储在数据存储中,还用于引用其他实体。现在,我正在使用 RequestFactory 在客户端上创建()对象并保存它们,但我需要一种方法来确定服务器生成的 id。

这是我想出的一种需要两次旅行的方法:

final OrganizationProxy proxy = context.create(OrganizationProxy.class);
context.persist().using(proxy).fire(new Receiver<Void>(){

    public void onSuccess(Void response)
    {
        requestFactory.find(proxy.stableId()).fire(new Receiver<OrganizationProxy>()
        {
            public void onSuccess(OrganizationProxy response)
            {
                //hey, now response has the server-generated id in it, along with any other values the server populated
            }
        });
    }
});

但似乎必须有一种方法可以在没有第二次旅行的情况下获得持久性 ID。似乎 requestFactory.find() 首先需要持久 id 才能工作。

如何在不向服务器发出第二次请求的情况下获取持久 ID?

=======更新=======

我终于想到(在 tbroyer告诉我;))我可以Long从 RequestContext 中的 persist() 方法返回 id。这不会从 中检索持久 id EntityProxyId,但它确实在单个请求中为我获取了新对象的持久 id。

我将保留这个问题 - 我仍然对从 EntityProxyId 中获取持久 id 感兴趣。

4

3 回答 3

9

您可以通过调用获取 EntityProxyId 的字符串表示形式RequestFactory.getHistoryToken()。这可以EntityProxyId通过调用转换回RequestFactory.getProxyId()

在 RequestFactory 用语中,新创建实体的 id 是“短暂的”。临时 id 仅在RequestFactory创建RequestContext用于创建EntityProxy. 当RequestContext触发并且所有方法调用都已由服务器处理时,SimpleRequestProcessor将检查有效负载的临时对象,如果它们已被持久化,则生成的有效负载将使用从getId()方法返回的值更新客户端的状态。

EntityProxyId当它从短暂状态切换到持久状态时,对象的身份和相等性不会改变,但其关联的历史令牌会改变:

OrganizationProxy proxy = context.create(OrganizationProxy.class);
final EntityProxyId<?> id = proxy.stable();
String ephemeralString = factory.getHistoryToken(id);
context.persist().using(proxy).fire(new Receiver<Void>() {
  public void onSuccess(Void response) {
    String persistedString = factory.getHistoryToken(id);
    assert !ephemeralString.equals(persistedString);
    assert factory.getProxyId(ephemeral) == factory.getProxyId(persistedString);

    MyRequestFactory otherFactory = GWT.create(MyRequestFactory.class);
    assert factory.getProxyId(ephemeral) != otherFactory.getProxyId(ephemeral);
    // Throws IllegalArgumentException
    otherFactory.find(otherFactory.getProxyId(ephemeral));
  }
});

在上面的演示中,一旦拥有persistedString,您可以将值存储在 cookie 或其他一些客户端持久性机制中,然后重新创建 id 以用于调用RequestFactory.find(). 第二个和第三个断言展示了一个临时 id 的“范围”。临时和持久形式可以与RequestFactory创建对象的形式互换使用。如果一个临时 id 与一个新创建的 a 实例一起使用RequestFactory(如果一个临时 id 被标记为History标记,就会发生这种情况),你会得到一个EntityProxyId,但它不能真正用于任何有用的目的。

于 2011-02-21T01:45:34.670 回答
1

实现 an 的类EntityProxyIdSimpleEntityProxyId. 这个类有一个方法getServerId(),它将返回 id。因此,通过检查instanceof您可以调用该方法。(实际上RequestFactory.getHistoryToken()甚至不检查,而只是强制转换为此类)。

SimpleEntityProxyId现在是坏消息:它已编码,SimpleProxyId并且包含方法的基类getServerId()特别声明:

编码地址对客户端是完全不透明的。它可能是一个 base64 编码的字符串,但它可能是 pi 的数字。除了将此字段的内容发送回服务器之外,任何其他代码都是错误的。

(该字段encodedAddress包含服务器 ID。)

于 2011-02-21T09:49:21.183 回答
1

我刚刚在代理接口中声明了 getId() 方法,它似乎可以工作。这种方法有什么问题吗?

于 2011-10-20T12:21:28.573 回答