17

GWT と GAE を使用して、データの永続性を必要とする Web アプリを開発したいと考えています。私が理解しているように、データ永続化のための唯一の (または少なくとも最も便利な) オプションは、JDO または JPA アノテーション付きオブジェクトを使用する GAE のデータストアです。また、GWT リモート プロシージャ コール (RPC) を使用してクライアントとサーバーの間でオブジェクトを送受信できるようにしたいので、オブジェクトを「デタッチ」できる必要があります。ただし、GWT RPC シリアライゼーションは分離された JDO/JPA オブジェクトを処理できず、近い将来に処理されるようには見えません。

私の質問: これに対する最も簡単で直接的な解決策は何ですか? 同じオブジェクトのクライアント/サーバーをサーバー側の永続性で共有できると、非常に便利です。

編集

GAE のデータストアで GWT RPC を引き続き使用したいことを明確にする必要があります。私は、これらすべてのテクノロジーを連携させるための最良のソリューションを探しています。

4

11 に答える 11

7

http://gilead.sourceforge.net/を使用してみてください

于 2009-05-09T17:10:53.750 に答える
5

Ray Cromwell が一時的なハックを行いました。私はそれを試しましたが、うまくいきます。

GWT は DataNucleus によって使用される非表示の Object[] をシリアル化できないため、Detachable エンティティの代わりに Transient を使用する必要があります。これは、クライアントに送信したオブジェクトをデータストアに挿入して戻すことができないことを意味します。実際のデータストア オブジェクトを取得し、すべての永続フィールドをそこにコピーして戻す必要があります。Ray のメソッドは、リフレクションを使用してメソッドを反復処理し、getBean() メソッドと setBean() メソッドを取得して、一時的な gwt オブジェクトの getBean() でエンティティ setBean() を適用します。

JDO を使用するように努力する必要があります。現時点では、JPA はラッパー クラス以上のものではありません。このハックを使用するには、すべての「Bean」フィールドに PROPER getBean および setBean 構文を使用して、すべての永続フィールドに getter メソッドと setter メソッドの両方が必要です。デフォルトのブールフィールドの使用が「is」の場合、すべてのゲッターが「get」で始まると想定しているため、ほぼ適切です。

この問題を修正し、Ray のブログにコメントを投稿しましたが、承認待ちであり、投稿するかどうかはわかりません。基本的に、私は @GetterPrefix(prefix=MethodPrefix.IS) アノテーションを org.datanucleus パッケージに実装して、彼の作業を補強しました。

投稿されず、これが問題である場合は、x_AT_aiyx_DOT_info Re: @GetterPrefix for JDO に電子メールを送信してください。修正をお送りします。

于 2009-05-14T10:02:54.723 に答える
5

私は最近、 JDO の代わりになるように設計されたObjectifyを見つけました。まだあまり経験はありませんが、JDO よりも使いやすく、軽量で、GWT を使用した DTO の必要性を回避できると主張していますが、その特定の機能はまだ試していません。

于 2010-03-07T18:57:28.813 に答える
3

少し前に、ORM またはプレーン SQL を使用して投稿を書きましたか?

これは昨年、私が書いていた GWT アプリケーションで発生しました。サービス実装におけるEclipseLinkからプレゼンテーション・オブジェクトへの多くの変換。ibatis を使用していた場合、ibatis で適切なオブジェクトを作成し、それらをスタックの上下に渡す方がはるかに簡単だったでしょう。一部の純粋主義者は、これは悪い™ であると主張するかもしれません。(理論的には) そうかもしれませんが、私が言いたいのは、コードが単純になり、スタックが単純になり、生産性が向上するということです。

これは基本的にあなたの観察と一致します。

しかしもちろん、それは Google App Engine のオプションではないため、クライアント側のオブジェクトと JPA エンティティの間に変換レイヤーを配置することはほとんどありません。

JPAエンティティは非常に厳格であるため、クライアント間で送受信するのにはあまり適していません. 通常、これを行うときは、いくつかのエンティティからのビットが必要です (したがって、ある種のプレゼンテーション層の値オブジェクトになります)。それがあなたの進むべき道です。

于 2009-04-14T23:01:36.157 に答える
2

現在、私は DTO (DataTransferObject) パターンを使用しています。必ずしもきれいでボイラープレートがたくさんあるわけではありませんが、GAE は現在でもかなりの量のボイラープレートを必要とします。;)

DTO を使用して (通常は) 1 対 1 でマップされたドメイン オブジェクトがあります。クライアントがドメイン情報を必要とする場合、DAO(DataAccessObject) はドメイン オブジェクトの DTO 表現を作成し、それをネットワーク経由で送信します。DTO が戻ってくると、DAO に DTO を渡して、適切なドメイン オブジェクトをすべて更新します。

ドメイン オブジェクトをネットワーク経由で直接渡すことができるほどクリーンではありませんが、GAE の JDO 実装と GWT のシリアライゼーション プロセスの制限により、これが現在これを処理する最もクリーンな方法であることを意味します。

于 2010-01-04T15:39:23.903 に答える
2

JSON の使用を検討できます。GWT には、クライアント側で JSON 文字列を解析および生成するために必要な API があります。サーバー側の JSON API がたくさんあります。google-gson で試してみましたが、これで問題ありません。JSON 文字列を POJO モデルに、またはその逆に変換します。これが、要件に適切なソリューションを提供するのに役立つことを願っています

于 2009-05-01T21:39:31.127 に答える
2

これに対する Google の公式の回答は GWT 2.1 RequestFactoryだと思います。あなたが GWT と GAE を使用していることを考えると、公式の Google フレームワークに固執することをお勧めします... 私は同様の GWT / GAE ベースのアプリを持っており、それが私がやっていることです。

ところで、RequestFactory の設定はちょっと面倒です。現在の Eclipse プラグインにはすべての jar が含まれているわけではありませんが、Stackoverflow で必要なヘルプを見つけることができました

于 2010-12-23T23:31:25.713 に答える
1

私も Objectify を使っていて、とても気に入っています。たとえば、テキストを文字列に変換したり元に戻したりするために、pre/postLoad メソッドをいじる必要があります。

于 2010-05-03T22:49:19.427 に答える
0

GWT は最終的に JavaScript にコンパイルされるため、切り離された永続性のためには、利用可能ないくつかのサービスのいずれかが必要になります。最もよく知られているのは、HTML5 ストアと Gears (どちらも SQLite を使用しています!) です。もちろん、どちらも広く展開されているわけではないため、ユーザーに最新のブラウザーを使用するか、あまり知られていないプラグインをインストールするよう説得する必要があります。ユーザーが従わない場合は、必ず使用可能なサブセットに分解してください

于 2009-04-14T22:29:13.397 に答える
0

データストア APIを直接使用してPOJO ドメイン オブジェクトをロード/保存するのはどうですか?

つまり、すべてのフィールドを手動で処理する必要がありますが (リフレクション ベースの自動化などのトリックを使用しない場合)、柔軟性が向上し、すべてのデータストア機能に完全にアクセスできる必要があります。

于 2010-01-14T20:10:21.120 に答える