2009-09-17 8 views
9

JPAエンティティを使用する場合のベストプラクティスは何ですか?JPAデータオブジェクトとしてのPOJO

JPAエンティティはPOJOだけなので、システムの他の部分でオブジェクトをデータオブジェクトとして使用することは適切であると考えられますか、それとも別のデータオブジェクトに変換する必要がありますか?

JPAと関係のないシステムの他の部分でもJPA Entity POJOを使用できますか?

答えて

8

エンティティは今や自分自身のデータを運ぶことができるので、なぜそれらを別のものに変換するのを悩ませますか?言い換えれば、私はDTO an AntiPattern in EJB 3.0に同意する傾向がある:

EJB 3.0より前のEJB仕様のエンティティBeanの重い性質上、Data Transfer Objects(DTO)のようなデザインパターンの使い方が生じました。 DTOは軽量オブジェクト(最初はエンティティBean自体であったはずです)になり、階層間でデータを送信するために使用されました。 [...]

EJB 3.0仕様は、Entity BeanモデルをPlain old Java object(POJO)と同じにします。この新しいPOJOモデルを使用すると、エンティティごとまたはエンティティのセットごとにDTOを作成する必要がなくなります。 EJB 3.0エンティティを階層全体に送信する場合は、単に実装するようにしてください。java.io.Serialiazable

+0

あなたは反パターンに関する興味深いドキュメントにリンクしているので、あなたに答えてくれます。 – Tazzy531

3

"その他の部品"の意味によって異なります。あなたのJPAエンティティは何らかの形であなたのシステムに関係している必要があります。なぜなら、JPAエンティティはすでに存在しているからです。重要な点は、全く違う2つの懸念事項(同じデザインのデザインや本当に大きなシステムのいずれか)に同じクラスを使用しないことです。他のすべてはおそらく、あなたの異なるPOJOの間の無限のマッピングの中に終わるでしょう。

たとえば、ユーザーのログイン。

ユーザーJPAエンティティ(したがってユーザーPOJO)はすでにユーザー名、パスワード(ユーザー名、パスワードを持っています)を持っていますが、ハッシュ、アドレス、おそらく他のものが保存されています)。 Webフォームからのログイン要求では、まったく同じオブジェクトを使用することができます(Springのようないくつかのフレームワークはすぐにそれをマップします)。空のUserオブジェクトを作成し、ユーザー名とハッシュされたパスワードを設定し、JPA Queryを例によって作成します。そのクエリーが1つの結果を返す場合、ログインは有効で、ロードされたユーザーオブジェクトをセッションに格納できます。

6

これは良い質問です。

JPAエンティティ・クラスをシステムの他の部分に公開すると、永続化メカニズムおよびオブジェクトがdbマッピングに公開されます。これらのオブジェクトのCRUDedおよび管理方法を制御できなくなります。永続性カプセル化を解除することで、システムの残りの部分に変更が波及する可能性があります。

システムの永続性への今後の変更は、不可能で、扱いにくく、制限があり、かつ/または危険である可能性があります。例:パフォーマンスやスケーラビリティを最適化する必要があるかもしれません。これには、キャッシング、dbスキーマの変更、非RDBMSの使用、複数のデータベースが必要な場合があります。カプセル化は、将来のdbスキーマへの移行を軽減するのにも役立ちます。

だから、トレードオフがある:永続性をカプセル化するJPAの上にアプリケーションの永続化層を

  • 管理と維持。すなわちインターフェースである。OR
  • あなたのアーキテクチャでは、全面的にJPAを使用することにしました。将来の変更によりシステム全体の影響が生じる可能性があることを受け入れます。

システム全体の頻繁な変更が受け入れられない場合は、最初のオプションが必要な場合があります。第三者がお客様のデータにアクセスしています。それとも、GUI、ビジネスロジック、永続性の3つのレイヤーアーキテクチャーを決めたのでしょうか。

アジャイル開発プロセスがあり、システム全体を制御し、システム全体の変更が必要な場合があることを受け入れる場合、2番目のオプションはOKです。

関連する問題