6

これはよくある質問/問題だと思いますが、適切で簡潔な回答を見つけることができませんでした。

問題

継承関係があるように見えるエンティティをマップする方法:

Company
  Supplier
  Manufacturer
  Customer

ただし、サプライヤーはメーカーになることができます。

また

Person
  Doctor
  Patient
  Employee

患者が医師になることも、従業員になることもできます。

提案: ロールを使用する

NHibernate フォーラムでの議論では、これは多重継承であるという反応がよくあります。

http://forum.hibernate.org/viewtopic.php?t=959076

彼らが提案する解決策は、コンポジションを使用するか、「ロール」を使用することです。ただし、それを正確に行う方法についての例や説明は見つかりません。

「継承よりも構成を優先します。」クラスでのちょっとしたお菓子を覚えていますか? この例では、多重継承を試みていることに同意する必要があります。C# や Java では (まだ) 不可能です。個人的には、リモデリングを検討して、Person オブジェクトを持ち、Person が Role の 1 対多のコレクションを持つようにすることをお勧めします。

4

3 に答える 3

4

おそらく、ロールの使用を検討する必要があります。したがって、Role には一連の Person が含まれます。または、Person は一連の役割またはその両方を持ちます。これはおそらく、人物を役割にマップする Association クラスがあることを意味します。

人に共通するすべてのプロパティを持つ Person クラスを定義します。次に、Role スーパー クラスと、DoctorRole、PatientRole、および EmployeeRole サブクラスを定義します (各ロールには異なるプロパティがあると仮定します)。

Person クラスには役割の Collection を定義でき、Role クラスには人の Collection を定義できます。または、Association クラスを作成する方が簡単かもしれません。それを PeopleRole と呼びましょう。

このページでは、PeopleRole が複合要素になるようにマッピングを行う方法について説明します。Order/Product/LineItem の例を見てください。Your Person は Order のようなもので、PeopleRole は LineItem のようなもので、Role は Product のようなものです。

于 2008-10-22T23:41:07.173 に答える
3

これは、NHibernateマッピングの問題ではなく、ドメインを適切にモデル化する方法に関する問題であるように思われます。

ドメインモデリングを整理すると、NHibernateマッピングが比較的簡単に外れることがわかると思います。

役割のモデリングのアイデアを理解するための1つの場所は、「カラーモデリング」を探すことです。このアイデアはPeter Coadに端を発していますが、JeffdeLucaにはいくつかのリソースがあります。

基本的な考え方は、参加者のアイデンティティを、アクティビティで果たす役割から分離することです。

たとえば、特定の人物のIDをキャプチャするPersonオブジェクトがあるとします。

次に、学生としての人の登録を記録するための追加情報をキャプチャする完全に別個のオブジェクト「Student」。Studentの各インスタンスには、登録された人への参照があります。1人の人物が、個別の登録ごとに1つずつ、多くの「学生」レコードに関連付けられている場合があります。

並行して、誰かが1対1の状況で学生を教えるために雇われたときに、雇用の詳細を記録する別個の「家庭教師」オブジェクトを持つことができます。Tutorオブジェクトは、誰かが家庭教師としてどのように雇用されているかに関する追加の詳細をキャプチャします。

この構造により、柔軟性が大幅に向上します。1人(Joe Bloggs)が学生、別の人(Jane Doe)が家庭教師、3人目(Chuck Norris)が両方の場合があります。

また、追加には既存のオブジェクトへの変更が必要ないため、別の役割(講師、マーカー、管理者)の導入が容易になります。

于 2008-10-23T09:32:15.560 に答える
1

関連するかもしれないもう少しの解説に出くわしました:

Naked Objects ブログのブログ投稿では、いくつかの異なるアプローチが概説され、それぞれの長所と短所が議論されています。

  • 「Any」関連マッピングの使用
  • ロールをクラスとしてモデル化する
于 2009-10-16T12:38:52.000 に答える