2011-08-09 14 views
4

私は現在、このディスカッションが行われたプロジェクトに取り組んでいます。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を)見てきたどのように多くの時間

  1. 、あなたはその恩恵についてどう思いますか:

    はのは、いくつかの経験を収集してみましょうか?

  2. どのように多くのプロジェクトで、DAOレイヤーの利点が得られる方法で永続化メカニズムを変更しましたか(db dialectを切り替えてORMレベルでジョブを実行できないため、他のDAOレイヤーを実装する必要がありましたか?
  3. 大規模なDAO構造(ドメインオブジェクトごとにインターフェイス+クラス)を作成したばかりのプロジェクトがいくつありますか?これは実際には使用されませんでした。
  4. ORMセッションで提供される抽象化を使用するだけで、DAOレイヤーがないアプリケーションについてはどう思いますか?

経験を共有してください。

答えて

2

ORMを使用する場合のIMO、DAOパターンは、実際にはデータベースエンジンを切り替える機能ではありません。それはおよそ

  • 責任を分離します:ビジネス・ロジックは、サービス層に行く、持続性はDAO層
  • が永続性をテストすることができるというDAO層
  • をあざけることにより、サービス層をテストすることができることになりますビジネスロジックの中に埋め込まれていないので、ロジックです。

私は通常、ドメインオブジェクトごとにDAOを使用するのではなく、機能的なユースケースのセットごとにDAOを使用することをお勧めします。実際、十分に複雑なアプリケーションでは、ほとんどのクエリが特定のドメインオブジェクトにリンクされているのではなく、ユースケースまたはユースケースのセットにリンクされていることがわかりました。しかし、YMMVと両方のアプローチを組み合わせることは、時には便利です。

だから、あなたの特定の質問に答えるために:

  1. をほとんど常に。 HibernateまたはJPAを使用するDAOを使用することは、プレーンJDBCを使用するDAOを使用することと同じではなく、ほとんどの場合
  2. となります。通常、データベースの選択は、プロジェクトが開始されるずっと前に行われ、決して変更されません。
  3. ドメインオブジェクトが存在するためではなく、必要なときにのみDAOを開発する傾向があります。しかし、 "汎用DAO"基底クラスを持つことは時々役に立ちます。
  4. 私は彼らがテストするのが難しく、よく構造化されていないと思うし、同じクエリ/ロードを何度も再実装することになります。再利用可能なDAO
+0

返信ありがとうございます。それでは別の質問があります: 1.デフォルトの実装でセッション抽象化を直接使用するサービス層のテストを模擬して行うことはできませんか? 2. "DAO per usecase"とはどういう意味ですか?これは私にとっても新しいパターンですが、このパターンも使用していますが、サービスレイヤー このアプローチのもう1つの問題は、データ複雑で反復可能なクエリにアクセスする方法を収集することです。これはデフォルトでDAOレイヤーで行うことができますが、通常これはサービスレイヤーで繰り返されます。これはこれらのDAOのプロキシです(多くのメリットがないからです)。 –

+0

1.いいえ、セッションメソッドが粗すぎるため、十分に具体的ではないためです。 dao.findFoosByField(String)をsession.createQuery(String)よりも擬似(検証)する方が簡単です。次にquery.setMaxResults()の後にquery.list()が続きます。例えば、ユーザー用のDAOではなく、役割用のDAOとプロファイル用のもう1つのDAOではなく、ユーザー、ロール、プロファイルの永続性を処理する単一のDAOを認可管理に使用する場合があります。 –

+0

OK、わかりました。私は模擬よりもむしろDBの人口をテストするので、嘲笑するDAOは本当に私を助けません。私がここで参照しているDAOの別のものは、制限/発注の問題です。結果では、これらのパラメータが必要なメソッドがたくさん必要であり、このすべてがすでに非常に便利なインターフェイスでステップダウンされています。私は本当に別の解決策に目を向けることに近いです。 –