私は現在、このディスカッションが行われたプロジェクトに取り組んでいます。ORMとDAO - 設計の質問
DAOパターンは(ウィキペディアによると):「コンピュータソフトウェアでは、データアクセスオブジェクト(DAO)は、ある種のデータベースまたは永続化メカニズムに抽象的なインタフェースを提供するオブジェクトであり、データベースの "。
しかし、ORMを使用すると、これは明らかにORM(例:休止状態)ジョブです。これは、いくつかの(ほとんどすべての)タイプのデータベースへの抽象的なインタフェースを提供します。
最後のいくつかのプロジェクトを確認して、DAOレイヤーを見てみましょう。最初のステップは、常にsave()、findById()、findAll()メソッドを持つ汎用のhibernate daoです。これは、私が単に休止状態のセッションメソッドをプロキシするためのものです。
また、ここで提案されているようなインターフェイスを参照してください:Generic DAO pattern in Hibernate、DAOを永続化する方法を休止する方法(マージ、条件クエリ)。このDAOは、Hibernate以外の永続性メカニズムでは使用できません。
最終的には質問です。そのような一般的なDAO設計では、DAOパターンをもたらす新しいものは何ですか?私はデータベースエンジンを切り替える場合は、私は休止状態のレベルでそれを切り替えています。ですから、ORMアプリケーションでDAOパターンを使用することによる利点は本当ですか?あなたはDAOクラス休止状態に強固に結合し、階層(または他のORMを)見てきたどのように多くの時間
- 、あなたはその恩恵についてどう思いますか:
はのは、いくつかの経験を収集してみましょうか?
- どのように多くのプロジェクトで、DAOレイヤーの利点が得られる方法で永続化メカニズムを変更しましたか(db dialectを切り替えてORMレベルでジョブを実行できないため、他のDAOレイヤーを実装する必要がありましたか?
- 大規模なDAO構造(ドメインオブジェクトごとにインターフェイス+クラス)を作成したばかりのプロジェクトがいくつありますか?これは実際には使用されませんでした。
- ORMセッションで提供される抽象化を使用するだけで、DAOレイヤーがないアプリケーションについてはどう思いますか?
経験を共有してください。
返信ありがとうございます。それでは別の質問があります: 1.デフォルトの実装でセッション抽象化を直接使用するサービス層のテストを模擬して行うことはできませんか? 2. "DAO per usecase"とはどういう意味ですか?これは私にとっても新しいパターンですが、このパターンも使用していますが、サービスレイヤー このアプローチのもう1つの問題は、データ複雑で反復可能なクエリにアクセスする方法を収集することです。これはデフォルトでDAOレイヤーで行うことができますが、通常これはサービスレイヤーで繰り返されます。これはこれらのDAOのプロキシです(多くのメリットがないからです)。 –
1.いいえ、セッションメソッドが粗すぎるため、十分に具体的ではないためです。 dao.findFoosByField(String)をsession.createQuery(String)よりも擬似(検証)する方が簡単です。次にquery.setMaxResults()の後にquery.list()が続きます。例えば、ユーザー用のDAOではなく、役割用のDAOとプロファイル用のもう1つのDAOではなく、ユーザー、ロール、プロファイルの永続性を処理する単一のDAOを認可管理に使用する場合があります。 –
OK、わかりました。私は模擬よりもむしろDBの人口をテストするので、嘲笑するDAOは本当に私を助けません。私がここで参照しているDAOの別のものは、制限/発注の問題です。結果では、これらのパラメータが必要なメソッドがたくさん必要であり、このすべてがすでに非常に便利なインターフェイスでステップダウンされています。私は本当に別の解決策に目を向けることに近いです。 –