2

JPA (Eclipse Link) を介して永続性を提供する Java バックエンドと通信するために Blaze DS を使用して Flex でアプリケーションを開発しています。

JPA エンティティを Blaze DS 経由で Flex に渡すときに問題が発生します。Blaze DS はリフレクションを使用して、エンティティのすべての getter メソッドを呼び出すことにより、JPA エンティティを ObjectProxy (事実上 HashMap) に変換します。これには、遅延初期化された 1/多対多の関係が含まれます。

あなたはおそらく私がどこに向かっているのかを見ることができます。JPAを介して単一のオブジェクトを渡すと、このオブジェクトのすべての1/多対多メソッドが呼び出されます。返されたオブジェクトごとに、1/多対多の関係がある場合、それらも呼び出されます。そのため、単一の JPA エンティティを返すことで、実際には複数のデータベース呼び出しを実行し、関連するすべてのエントリを単一の ObjectProxy インスタンスとして返すことになります!

これまでの私の解決策は、各エンティティを ObjectProxy に、またはその逆に変換するトランスレータを作成することです。これは明らかに面倒であり、より良い方法が必要です。

考えてください?

4

3 に答える 3

3

別の方法として、BlazeDS の代わりにGraniteDSを使用することを検討できます。GraniteDS は BlazeDS よりもはるかに強力なデータ管理スタックを備えており (LCDS との競合性が高くなります)、すべての主要な JPA エンジン (Hibernate、EclipseLink、OpenJPA など) の遅延読み込みを完全にサポートします。 .

さらに、GraniteDS には優れたクライアント側の透過的な遅延読み込み機能と、いわゆる遅延読み込みメカニズムさえあります。

また、中間 DTO は一切必要ありません。JPA エンティティをそのままシリアライズし、クライアント側でコード生成された ActionScript Bean を使用して初期化状態を維持します。

于 2012-04-20T15:25:06.350 に答える
2

残念ながら、Flash クライアントで遅延読み込みを実行するのは簡単ではありません。dpHibernateのような実用的なソリューションがいくつかありますが、これまでにテストしたさまざまなソリューションはすべて、パフォーマンスと使いやすさの点で期待するものに達していません。

したがって、私の経験では、常にDTOを使用することが最善かつ最も信頼性の高いソリューションです。これにより、データベースとビューのレイヤーが明確に分離されるという利点が追加されます。ただし、これには、多対多の関係を解決するために一括読み込みまたは 2 回目のサーバー ラウンド トリップを実装する必要があり、DAO および DTO フィールドの値をコピーするためのボイラープレート コードをさらに多く実装する必要があります。

どちらを選択するかはユース ケースによって異なります。場合によっては、メイン オブジェクトのフィールドのみを取得するだけで十分な場合があります。その場合は、DTO から関連オブジェクトのリストを単純に省略できます (クエリに必要な値のみを転送します)。関連するエンティティのリスト全体が実際に必要になる場合がありますが、その場合は、一括読み込みを使用するか、2 つ目のリモート オブジェクトを設定してリストのみを検索することで取得できます。

于 2012-04-13T13:45:59.647 に答える
0

TopLinkは、正確に必要な属性のコピー・グループを提供できるcopyObject() APIも提供します。このコピーを使用して、不要な関係を避けることができます。

切り離されたオブジェクトがある場合は、不要なフィールドを無効にするか、DTO を使用することができます。

于 2012-04-25T13:54:13.170 に答える