2

私の環境:
-RequestFactory(GWT 2.5rc2、2.5rc1および2.4より前-質問に関して違いはありません)
-Hibernate
-SpringのOpenSessionInViewフィルター(リクエストごとのセッション)

基本的に次のような構造で EntityProxy を永続化したい:

EntityProxy_A
  ... other properties ...
  --> Set<EntityProxy_B setEntProxB;
    -->  EntityProxy_C entProxC;
    -->  EntityProxy_D entProxC;

リクエスト メソッドは、ドメイン クラス (ロケーターの概念) とは別のクラスに実装されています。したがって、InstanceRequest persist() は使用しません。

解決策/質問 1 - 次のアプローチが機能する必要があります。

次のようなリクエストメソッドがあります

Request<EntityProxy_A> save(EntityProxy_A);  
Request<EntityProxy_A> createNew();

createNew() を使用して、EntityProxy_A のインスタンス (「... その他のプロパティ ...」に関する値で初期化され、既にデータベースに永続化されている) をクライアントに取得します。その時点で EntityProxy_B のセットが作成されないことに注意してください。

createNew() の OnSuccess で私は

 public void onSuccess(EntityProxy_A response) {
   MyRequest request = myRequestFactory.getMyRequest();
   EntityProxy_A editableA = request.edit(response);
   ...

次に、「リクエスト」で EntityProxy_B、C、D を作成し、すべてをアセンブルします (上記のように)。

今、私は電話します

request.save(editableA)
       .with("setEntProxB",
             "setEntProxB.entProxC",
             "setEntProxB.entProxD")
       .fire(Receiver<EntityProxy_A>() {
          @Override
          public void onSuccess(EntityProxy_A response) {
             .......
          }

パラメータ Entity_A は、サーバーのリクエスト メソッド impl にそのすべての子とともに到着し、その後永続化され、すべてが db に表示されます。

休止状態のセッションで強制フラッシュを呼び出すと (OpenSessionInView を使用しているため、通常、リクエスト メソッドの impl を終了した後もすべてが永続化されることを思い出してください)、EntityProxy_B、C、D の新しく作成/永続化されたインスタンスのすべての ID を確認することもできます。

クライアントに返された JSON を見ると、entProxC の属性として格納されているデータを見つけることさえできるので、オブジェクト グラフが正しく構築され、クライアントに送信されていると仮定します。

しかし、「保存」呼び出しの OnSuccess で今何が起こるかは次のようになります

 public void onSuccess(EntityProxy_A response) {
   MyRequest request = myRequestFactory.getMyRequest();
   EntityProxy_A editableA = request.edit(response);
   ...

「編集」を呼び出すと、エラー
「... error Unfrozen bean with null RequestContext ...」
が発生します。これは、EntityProxy_C と EntityProxy_D (セット内の EntityProxy_B ではありません!) が「frozen = false」として返され、もちろんそのときに発生します。また、リクエストコンテキストはありません。JSON を調べると、entProxC: {} のように表示されます (すべてが空で、ペイロードはありません)。

Linkに記載されている状況を正確に見つけましたが、コードに解決策が見られません...言及されたエラーだけです。

今私の質問 - RequestFactory をそのように使用できるはずですか?

解決策/質問 2 - 今のところ私の解決策であり、そのように requestfactory を使用しても問題ありません:

私は今、次のようなメソッドをリクエストしています

Request<Void> save(EntityProxy_A);  
Request<EntityProxy_A> createNew();

最初のアプローチのように createNew() を呼び出します。今、私はインスタンス変数も持っています

 EntityProxy_A myWorkA;
 ....
 public void onSuccess(EntityProxy_A response) {
   MyRequest request = myRequestFactory.getMyRequest();
   myWorkA = request.edit(response);
   ...

次に、「myWorkA」で編集を行い、最後に。

request.save(myWorkA)
       .fire(Receiver<Void>() {
          @Override
          public void onSuccess(Void response) {
             .....
          }

ここでは、サーバーから EntityProxy_A が返されません。とにかく、すべてをクライアントに転送する理由を考えました (永続化された EntityProxy_B、C、D から新しく作成された ID を除く)。したがって、クライアント側で特定の EntityProxy へのポインターが必要な場合は、EntityProxy.stableId() を使用するようになりました。

OnSuccess で私は

 public void onSuccess(Void response) {
   MyRequest request = myRequestFactory.getMyRequest();
   myWorkA = request.edit(myWorkA);
   ...

私はすでに「myWorkA」を持っているので、新しい RequestContext 内で編集可能にして、編集を続けて保存して保存して保存してみませんか...

これは私にとって完璧に機能します...私の質問...それは良いことですか?

サーバーから最新バージョンをロードしたことがないため、もちろんまだNULLエンティティIDが含まれている「myWorkA」を再保存すると、問題はありません。対応するエンティティはサーバー上で更新され、更新されません何度も作成されます (NULL ID のために推測できます)。

解決策 1 が機能しない (またはいずれにせよ機能することが期待されない) 理由と、解決策 2 に示すように機能しても問題ないかどうかを明確にしてください。

私の残りの唯一の他のアプローチは、次のようなものを持つことです:

Request<Void> save(EntityProxy_A);  
Request<EntityProxy_A> load(Long entProxId);  
Request<EntityProxy_A> createNew();

しかし、私はそれが好きではありません...トラフィック...

とにかく今のところ-それが RequestFactory の正しい使用法である場合-私はソリューション2をはるかに好みます.

回答をお待ちしております。

こんにちは、アンドレアス。

4

0 に答える 0