8

エンティティで IDを使用Longして、データストアに格納するだけでなく、他のエンティティを参照しています。現在、RequestFactory を使用してクライアントで create() オブジェクトを作成し、それらを永続化していますが、サーバーが生成した ID を把握する方法が必要です。

これは、2回の旅行が必要な方法の1つです。

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

しかし、2 回目のトリップなしで永続 ID を取得する方法が必要なようです。そもそも requestFactory.find() が機能するには、永続的な ID が必要なようです。

サーバーへの 2 回目のリクエストなしで永続 ID を取得するにはどうすればよいですか?

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

(tbroyerが私に言った後;))、 RequestContextLongの persist() メソッドから ID を返すことができることに最終的に思いつきました。これは から永続 ID を取得しませんEntityProxyIdが、単一の要求で新しいオブジェクトの永続 ID を取得します。

この質問はそのままにしておきます - EntityProxyId から永続 ID を取得することにまだ興味があります。

4

3 に答える 3

9

を呼び出して、EntityProxyId の文字列表現を取得できますRequestFactory.getHistoryToken()EntityProxyIdこれは、を呼び出すことで に戻すことができますRequestFactory.getProxyId()

RequestFactory の用語では、新しく作成されたエンティティの ID は「エフェメラル」です。RequestFactoryエフェメラル ID は、 の作成にRequestContext使用された を作成した のインスタンス内でのみ有効ですEntityProxy。がRequestContext起動され、すべてのメソッド呼び出しがサーバーによって処理されると、SimpleRequestProcessorはペイロードの一時オブジェクトをチェックし、永続化されている場合は、結果のペイロードがクライアントの状態をgetId()メソッドから返された値で更新します。

のオブジェクト ID と等価性は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()。2 番目と 3 番目のアサーションは、一時 ID の「スコープ」を示しています。一時的なフォームと永続化されたフォームはRequestFactory、オブジェクトを作成したものと同じ意味で使用できます。新しく作成された のインスタンスでエフェメラル ID を使用すると(これは、エフェメラル ID がトークンRequestFactoryとしてブックマークされた場合に発生します)、 を取得しますが、実際には有用な目的で使用することはできません。HistoryEntityProxyId

于 2011-02-21T01:45:34.670 に答える
1

を実装するクラスEntityProxyIdはですSimpleEntityProxyId。このクラスにはgetServerId()、IDを返すメソッドがあります。したがって、確認するinstanceofことで、メソッドを呼び出すことができます。(実際RequestFactory.getHistoryToken()にはチェックすらしませんが、単にこのクラスにキャストします)。

悪いニュースです。これはエンコードされており、メソッドの基本クラスでSimpleEntityProxyIdありSimpleProxyId、メソッドが含まれていますgetServerId()。具体的には次のように述べています。

encodeAddressは、クライアントに対して完全に不透明です。おそらくbase64でエンコードされた文字列ですが、円周率の数字である可能性があります。このフィールドの内容をサーバーに送り返す以外のことを行うコードはすべて間違っています。

(フィールドencodedAddressにサーバーIDが含まれている場合。)

于 2011-02-21T09:49:21.183 に答える
1

Proxy インターフェイスで getId() メソッドを宣言したところ、動作しているようです。このアプローチに問題はありますか?

于 2011-10-20T12:21:28.573 に答える