これはおそらく古くからの質問だと思いますが、より良い方法は何ですか?アプリケーションのすべてのレイヤーでドメインモデルオブジェクトを使用し、JSPで値をそれらに直接バインドすることもできます(私はJSFを使用しています)。または、ドメインモデルオブジェクトをDAOまたはサービスレイヤーでDTOに変換し、軽量のDTOをプレゼンテーションレイヤーに送信します。
データベースを変更するとすべてのDTOが変更されるのに対し、どこでもモデルオブジェクトを使用するには、影響を受けるモデルオブジェクトを変更するだけでよいため、DTOを使用するのは意味がないと言われています。ただし、DTOの使いやすさと軽量性はそれを上回っているようです。
私のアプリはHibernateモデルオブジェクトを使用し、独自にカスタム作成されたモデルオブジェクトを使用していることに注意してください(つまり、DBセッションにバインドされず、常にデタッチされます)。上記のシナリオのいずれかが、厳密なモデルオブジェクトパターンにとってより有益ですか?Hibernateの使用は、LazyInitializationExceptionsなどに関して非常に大きなPITAでした。
私はさらに議論を進めることを期待してこの質問を編集しています(私がこれを正しく行っているかどうかはわかりません):
私がモデルオブジェクトで抱えている問題は、それらがまったく柔軟ではないということです。以下のコメントは、モデルオブジェクトがすべてのレイヤーで使用できるようにアプリケーションを設計する必要があることを示しています。なんで?ユーザーがばかげた機能の一部を望んでいる場合、私は彼らに「それはモデルオブジェクトでは機能しない」と言うことになっていますか?
単純明快で、モデルオブジェクトが機能しない場合があります。あなたが持っているかもしれません:
public class Teacher {
List<Student> students;
[tons of other Teacher-related fields]
}
public class Student {
double gpa;
[tons of other Student-related fields]
}
しかし、多分あなたはそのすべての情報を必要としないでしょう。必要なのは、教師の名前、今年教える生徒の数、およびすべての生徒の平均GPAを合わせたものだけです。その場合はどうしますか?完全な教師情報と生徒の関係を取得すると、コードは生徒のリストにカウントされ、内部のすべてのGPAの合計平均を計算しますか?これは、「String lastName」、「int numStudents」、および「doublecombinedGpa」を使用してDTOを作成するよりも手間がかかるようです。
これらについては決心しているように聞こえるかもしれませんが、モデルオブジェクトをすべてのインスタンスで完全にクリーンに使用できるアプリケーションではまだ作業していません。異常なユーザー要求を伴う通常の実際のアプリケーションは、そのようには機能しません。