4

Spring MVC と Hibernate を使用する CRM プロジェクトに取り組んでいますが、Hibernate 基準を使用するのに最適な場所がわかりません。プレゼンテーション層に検索機能があり、ユーザーはさまざまな方法でさまざまなパラメーターに基づいて検索できるため、休止状態の基準を使用したいと考えています。ID だけが必要な場合もあれば、プロパティのサブセットが必要な場合もあれば、複数のテーブルを結合する必要がある場合もあります。そのため、プレゼンテーションからパラメーター、順序、必須パラメーター、検索制限のリストを渡す代わりに、hibernate の基準のような構造化された基準を構築します。層からデータ層へ、コードをクリーンアップできます。ただし、MVC アーキテクチャに反するため、プレゼンテーション層で休止状態を使用するのは正しくありません。そして、休止状態の基準を複製することが正しいアプローチだとは本当に思いません。私は3つのアプローチを考えることができました:

  1. 検索リクエストの種類ごとに 1 つずつ、ビジネス レイヤーで多数のメソッドを作成し、状況に応じてプレゼンテーション レイヤーからこれらの各関数を呼び出します。これらの各メソッドは基本的に、SQL クエリ (または条件オブジェクト) を作成してデータベースからデータを取得する対応する DAO メソッドにパラメーターを渡す以外は何もしません。このアプローチでは、パラメーターを DAO に渡す以外に何もしない何百ものメソッドになってしまいます。

  2. プレゼンテーション (またはビジネス層) で Hibernate の Criteria クラスに似たクラスを作成します。次に、プレゼンテーション層の検索パラメーターを使用してこのオブジェクトを開始し、DAO に渡します。次に、DAO は、このオブジェクトに基づいて休止状態の基準オブジェクトを作成します。このアプローチには、休止状態の基準クラスの複製が含まれます。

  3. プレゼンテーション層で Hibernate の Criteria クラスを開始し、それを DAO に渡して検索結果を取得します。

どちらが最善のアプローチか教えてください。

ありがとう

4

3 に答える 3

1

最良の選択は、クエリの要件によって異なると思います。

可能であれば、最初のオプションを選択することをお勧めします。多くの null 許容パラメーターを使用する DAO 検索メソッドを実装していることに気付くことがよくあります。対応するメソッド パラメータが NULL に設定されていない場合、DAO メソッド自体が制約を追加する条件オブジェクトを作成します。

これは簡単な例です:

public List<SomeObject> findSomeObjects(String name, Integer categoryId, 
      Date dateTimeFrom, Date dateTimeUntil) {
   if (name != null)
     // add name to criteria
   if (categoryId != null)
     // add category to criteria
   // ...
}

本当に多くの異なる検索操作があり、組み合わせの数が非常に多い場合は、2 番目の方法を試すこともできます。おそらく、ユースケースに合わせて単純化および調整することにより、基準の「クローン」を制限できます。

于 2011-10-04T02:10:39.920 に答える
1

Another option is to create a query-specific layer. This concept comes from CQRS. I don't use NHibernate but I do use ADO.NET to perform my queries directly since I subscribe to the idea that the domain model should not be queried. Nothing wrong with loading a full aggregate here-and-there but definitely not for ad-hoc querying.

So, hypothetically, you could have something like ContactQuery with methods such as:

  • public string Name(Guid contactId)
  • public DataRow Details(Guid contactId)
  • public DataTable CustomerContacts(Guid customerId)

In this way your queries are abstracted. Hopefully NHibernate projections return DataRow / DataTable :)

于 2011-10-04T04:29:17.200 に答える
0

Criteria オブジェクトを作成して DAO レイヤーに渡します。その理由は 2 つあります。

  1. DAO でのファインダー メソッドの自然な爆発を防ぐため
  2. コードの重複を避けるため (これは 2 番目のオプションに固有のものです)。

したがって、基準オブジェクトを垂直ドメイン層の一部として扱うことができます。

PSあなたの状況はわかりませんが、Hibernate固有の機能への依存を強く必要とせずに避けるために、Hibernate Criteriaの標準的な「代替」としてJPA 2 Criteriaを使用するのが少し良いオプションかもしれません。

于 2011-11-23T16:31:05.450 に答える