その関係自体にプロパティがある場合、クラスを同じクラスの他のインスタンスにどのようにマップしますか?
テーブル Person にマップされている Person というクラスがあります
PersonID PersonName PersonAge
----------------------------------
1 Dave Dee 55
2 Dozy 52
3 Beaky 45
4 Mick 55
5 Tich 58
PersonPerson という結合テーブルを使用して、Person と Person の間に多対多の関係が必要です。
PersonPersonID PersonID RelatedPersonID RelationshipID
--------------------------------------------------------
1 1 5 1
2 3 4 2
3 2 1 3
PersonPerson テーブルに次の属性が必要です。
RelationshipID RelationshipName
--------------------------------
1 Colleague
2 Manager
3 Tutor
この質問とBilly McCafferty によるリンク先の投稿では、PersonPerson テーブルに列が追加されているため、PersonPerson 関係を通常の JOIN から独自のエンティティに昇格させる必要があると説明しています。ただし、自己結合の場合はどうすればよいかは説明されていません。違いは、すべての関係者をDave Dee (ID = 1)に依頼すると、 Tich (ID = 5) だけでなくDozy (ID = 2)も取得する必要があることです。RelatedPersonID 列にもあります。
これまでの私の解決策は、 Person クラスに 2 つのプロパティを持つことです。
public virtual IList<PersonPerson> PersonPersonForward {get;set;}
public virtual IList<PersonPerson> PersonPersonBack {get;set;}
private List<PersonPerson> personPersonAll;
public virtual List<PersonPerson> PersonPersonAll
{
get
{
personPersonAll = new List<PersonPerson>(PersonPersonForward);
personPersonAll.AddRange(PersonPersonBack);
return personPersonAll;
}
}
そして、hbm に次のように記述します。
<bag name="PersonPersonForward" table="PersonPerson" cascade="all">
<key column="PersonID"/>
<one-to-many class="PersonPerson" />
</bag>
<bag name="PersonPersonBack" table="PersonPerson" cascade="all">
<key column="RelatedPersonID"/>
<one-to-many class="PersonPerson" />
</bag>
これはささいな不格好でエレガントではないようです。NHibernate は通常、ほとんどの日常的な問題に対する洗練されたソリューションを備えています。上記はこれを行うための賢明な方法ですか、それともより良い方法がありますか?