データ アクセス オブジェクト (DAO) は一般的な設計パターンであり、Sun によって推奨されています。しかし、Java DAO の最も初期の例では、リレーショナル データベースと直接対話していました。つまり、それらはオブジェクト リレーショナル マッピング (ORM) を行っていました。最近では、JDO や Hibernate などの成熟した ORM フレームワークの上に DAO があるのを目にしますが、それが本当に良い考えなのか疑問に思います。
JDOを永続層としてWebサービスを開発しており、DAOの導入を検討しています。他のオブジェクトのマップを含む特定のクラスを扱うときに問題が発生することが予想されます。
public class Book {
// Book description in various languages, indexed by ISO language codes
private Map<String,BookDescription> descriptions;
}
JDO は、これを "BOOKS" テーブルと "BOOKDESCRIPTIONS" テーブルの間の外部キー制約にマッピングするほど巧妙です。BookDescription オブジェクトを透過的に読み込み (遅延読み込みを使用していると思います)、Book オブジェクトが永続化されるとそれらを永続化します。
「データ アクセス レイヤー」を導入して BookDao のようなクラスを作成し、その中にすべての JDO コードをカプセル化するとしたら、この JDO の子オブジェクトの透過的な読み込みはデータ アクセス レイヤーを迂回するのではないでしょうか? 一貫性を保つために、BookDescriptionDao オブジェクト (または BookDao.loadDescription メソッド) を介してすべての BookDescription オブジェクトをロードして永続化するべきではありませんか? しかし、そのようにリファクタリングすると、モデルの操作が不必要に複雑になります。
私の質問は、ビジネス層で直接 JDO (または Hibernate、または好きな ORM) を呼び出すことの何が問題なのですか? その構文はすでに非常に簡潔であり、データストアに依存しません。それをデータ アクセス オブジェクトにカプセル化する利点は何ですか?