我在我的实体中使用Long
ID,不仅要将它们存储在数据存储区中,还要引用其他实体。现在,我正在使用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 told me;)之后发生了我可以从RequestContext中的persist()方法返回Long
id。这不会从EntityProxyId
中检索持久性ID,但它确实在单个请求中获得了新对象的持久ID。
我会打开这个问题 - 我仍然有兴趣从EntityProxyId获取持久性ID。
答案 0 :(得分:9)
您可以通过调用RequestFactory.getHistoryToken()
获取EntityProxyId的字符串表示形式。这可以通过调用RequestFactory.getProxyId()
转换回EntityProxyId
。
在RequestFactory的说法中,新创建的实体的id是“短暂的”。短暂ID仅在创建用于创建RequestFactory
的{{1}}的{{1}}的实例中有效。当RequestContext
被触发并且服务器已经处理了所有方法调用时,EntityProxy
将检查有效负载的临时对象,如果它们已被持久化,则生成的有效负载将使用该值更新客户端的状态从RequestContext
方法返回。
SimpleRequestProcessor
在从短暂状态切换到持久状态时,对象标识和相等性会发生变化,但其关联的历史记录标记会发生变化:
getId()
在上面的演示中,一旦你有了EntityProxyId
,就可以将值存储在cookie或其他一些客户端持久性机制中,然后重新创建id以用于调用{{1 }}。第二和第三个断言证明了短暂身份的“范围”。短暂和持久的表单可以与创建对象的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));
}
});
互换使用。如果短暂的id与新创建的persistedString
实例一起使用(如果短暂的ID被标记为RequestFactory.find()
令牌,则会发生这种情况),您将获得RequestFactory
,但它不能真正用于任何有用的目的。
答案 1 :(得分:1)
实施EntityProxyId
的班级是SimpleEntityProxyId
。这个类有一个方法getServerId()
,它将返回id。因此,通过使用instanceof
进行检查,您可以调用该方法。 (实际上RequestFactory.getHistoryToken()
甚至没有检查,只是简单地转换到这个类。)
现在是坏消息:它是编码的,SimpleEntityProxyId
的基类是SimpleProxyId
,包含方法getServerId()
,具体说明:
encodedAddress对客户端完全不透明。它可能是base64编码的字符串,但它可能是pi的数字。除了将此字段的内容发送回服务器之外的任何其他代码都是错误的。
(字段encodedAddress
包含服务器ID。)
答案 2 :(得分:1)
我刚刚在我的Proxy接口中声明了getId()方法,它似乎有效。这种方法有问题吗?