この種のデザインパターンを持つために私が取り組んでいるプロジェクトの1つは、1つのBeanがjsp / action / serviceクラスによって定義および使用されます。つまり、プレゼンテーションおよびビジネスロジックレイヤーによって使用され、別のBeanが定義および使用されます。 「エンティティ」と呼ばれるDAOレイヤーは、これら2つのBeanの内容に関係なく、実質的に同じです。JavaEEデザインパターンでは、各レイヤーを分離するために2つのBeanを使用する必要があると言われています。デカップリングについて私が理解していることは、クラスのワークフローとクラス階層によって実装されますが、データフローの場合、同じBeanを使用するのは簡単でスムーズであり、DAOレイヤーにPOJOを導入する理由の1つはこの変換がスムーズであることを確認してください。このデータフローを分離することで得られるメリットと、データフローで同じBeanを使用することで得られるデメリットについての専門知識を共有してください。
3 に答える
トレンディである、または何かに準拠しているという理由だけで不要なものを使用することは実際には意味がありませんが、将来の証拠を持つことは問題の価値があるかもしれません。
実際にそこにあるのは、ドメインモデル(非エンティティBean)とエンティティです。これは、複雑なドメインロジックを処理する場合、エンティティ内にロジックを配置する代わりに、ドメインロジックPOJO内に配置する場合、またはデータがかなり複雑で、DMBeanを実際に直接マップできない場合に必要です。データベースの場合、それを行うには複数のエンティティが必要です。ドメインモデルは、継承にも役立ちます。
さて、あなたのBeanがまったく同じである場合、あなたは非常に単純なモデルを持っているか、ドメインモデルを適切に使用していないかのどちらかです。
たとえば、古典的な「エンタープライズアプリケーションアーキテクチャのパターン」の第9章にあるドメインモデルの「パターン」を確認する必要があります。
「JavaEEのデザインパターンでは2つのBeanを使用する必要がある」と言った人は間違っています。必要に応じて、常にそのようにすることに熱狂的な人もいますが、これは必須ではありません。
(彼らは、プレゼンテーション層に公開できないEJB3以前のエンティティBeanを考えていた可能性があるため、DTOへの何らかのマッピングが必要でした。しかし、それは長い間時代遅れになっています。当時でもエンティティBeanを避け、JDBCを使用するのが一般的でした。)
これは、階層化されたアプリケーションでDTOを使用することについて私が気に入っている記事です。
プレゼンテーション層に個別のBeanを使用することを強く支持する人々と話をしましたが、エンティティを個別のプレゼンテーション層Beanにマッピングすることを支持する最大の懸念は、永続オブジェクトにメソッドがあり、呼び出されるとデータストアに変更が生じることでした。そして、それらのメソッドがプレゼンテーション層から呼び出されないことを保証する必要がありました。私にとって、それは彼らがPOJOを使用するポイントを逃したことを意味します永続性の場合、つまり、ビジネスロジック(つまり、オブジェクトグラフの状態を変更するメソッド)を含めることができますが、インフラストラクチャへの依存関係はありません。Gavin Kingとその会社は多くの問題を抱えていたため、永続エンティティにsaveメソッドを配置する必要はありませんでした。そこで、永続エンティティにsaveメソッドを配置し、確認するために大量の作業が必要になりました。そもそもそこにあるべきではなかった方法を悪用する人は誰もいません。
Java EE(最近はJ2EEではありません)は、セッションEJBファサードの背後にあるJPAレイヤーをラップするデータアクセス(エンティティBeanの置き換え)にJPAを使用することを提案します。あなたの質問は、そのファサードで使用されるタイプについての決定に相当すると思います。とアウト。それらのDTOはJPABeanである可能性がありますか、それとも別のクラスを使用する必要がありますか?
JPA Beanは単に注釈付きのPOJOであるため、JSP/サーブレット層に合理的に渡すことができます。単純なケースでは、それが私が起こっていることです。ビジネスロジックがより面白くなるにつれて、DTOとしてよりビジネスに焦点を合わせたオブジェクトが必要になる場合があることに気づきました。そのため、オブジェクトを分離します。
私のアドバイス:呼び出し元にとって意味のあるものの観点からSession Beanファサードを設計し、JPAオブジェクトが機能することが判明した場合は、それらを使用します。