1

私はJPAにあまり詳しくありませんが、次のシナリオがあります。KISS/ DRYの理由から、サーバーとクライアント(Java SE)の両方で同じクラス(「コード」を読み取る)を使用したいと思います。これを行うための1つの可能な方法はEntityManager、エンティティの要求をサーバーに渡し、最後にすべてのエンティティをサーバーに戻して「バッチ永続化アクション」を実行する(特別な?)クライアントを使用することです。クラスは、データを(再)検証し、いくつかのトランザクション操作(更新など)を適用し、JPA実装によってすべて適切に永続化できます。

質問は:それは可能ですか?どのように?(これに対する解決策はすでにありますか?「いくつかの」コードでこれを解決するのは簡単ですか?)


編集:わかりました、皆さんのためにいくつかのことを明確にしましょう。私のバックグラウンドは、汎用永続化サービスと呼ばれるものを使用する、社内で開発されたアプリケーションフレームワークです。つまり、単一のトランザクション内でCRUDアクション(任意のテーブルのアクションごとに1つのサービス)を実行するためのサービスですが、これらのアクションをインターセプトし、検証と(多くの場合)複雑なビジネスルール(他のテーブルの更新を伴う)を提供するクラス(サービス内)によってサポートされます。等。)。これは、古いMicrosoft製品で実装されていました。現在、.NETへの移行があり、最近、同様に機能するが、DevForceやCSLAなどのより高度なフレームワークが登場しました。特にDevForceは、私がJavaでもやりたいことを提供します(このページの「クライアントでの実行」の段落を参照してから、より良い概要については、このページを参照してください)。

この一般的な主題に関する私の古い質問:CSLAと「同等の」Java

4

2 に答える 2

1

私は以前に同様のことをしようとしましたが、おそらく私の発見について少しだけ共有します(当時はWSにHibernate + XFireを使用していました)

あなたが考えていることは理論的にはうまくいくと思います。必要なのは、管理対象エンティティをシリアル化してクライアントに送信することだけです。クライアントはオブジェクトを逆シリアル化して更新し(もちろん、クライアント側では、これは単に通常のPOJOであり、管理対象エンティティではありません)、サーバーに送り返します。この時点で、サーバーが受け取るオブジェクトは単に分離されたオブジェクトです。セッションに再接続して(JPA / Hibernateがそれらの楽観的同時実行性チェックを実行します)、永続性を実行できます。

ただし、これは非常に単純なPOJOに対してのみ正常に機能します。大きな問題の1つは、JPA(またはほとんどすべてのORMフレームワーク)で、異なるエンティティ間に関係があることです。たとえば、注文には製品とアカウントとの関係があり、アカウントにはクライアントとの関係があり、クライアントにはアドレスのリストがあります...など。遅延フェッチ、関係のためにサーバー側で操作している場合は、ほとんど問題ありません。アクセスするまで実際にはフェッチされません。ただし、シリアル化を実行すると、解決が困難な問題になります。JAXBのようなほとんどのシリアル化ソリューションは、すべてのプロパティを再帰的にナビゲートするだけです。その結果、Orderオブジェクトのみをクライアント側に送信することを期待しますが、最終的には膨大なデータをクライアントに送信します。一部のプロパティをシリアル化しないようにシリアライザーに指示するだけでは機能しません。オブジェクトが返送され、デタッチされたobjをセッションに再アタッチすると、JPA / Hibernateは、単に関係を無視しているのか、実際に関係を削除します。もちろん、あなたができるトリックはまだいくつかありますが、これらすべてがそのようなアプローチを採用するのに苦労し、もはやエレガントではありません。

于 2013-02-20T02:13:47.623 に答える
0

あなたのアイデアは賢いです。

しかし、あなたが提案したことをすることは不可能です。なんでじゃないの?さて、これに答えるには、まず「管理対象エンティティとは何か」を理解する必要があります。

管理対象エンティティは、「キャッシュされた」インスタンスに他なりません。エンティティマネージャ内に存在するインスタンス。このインスタンスをネットワーク経由で別のマシンに送信する場合は、シリアル化してコピーします。もちろん、管理されていない別のインスタンスをリモートサーバー上に作成します(エンティティマネージャーはその存在を知らないため)。 。

反対側には、エンティティマネージャをシミュレートし、このコピーされたエンティティを明らかに「管理」するための「十分にスマートな」ものが存在する可能性がありますが、これはJPA仕様の範囲外であり、自分で実装する必要があります(簡単に)。このために信頼できるものは存在しないと思います。

解決策は、クライアントから明示的に(サーバーから公開されたメソッドを介して)永続化、更新などすることです。

于 2011-08-13T00:08:44.933 に答える