私の環境:
-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をはるかに好みます.
回答をお待ちしております。
こんにちは、アンドレアス。