2009-06-06 8 views
1

私のオブジェクトモデルは、チャンネルデータとフィード項目(個々のポッドキャスト)を持つポッドキャストフィードを表します。これは以下のように構成されています。私のデータベースで [NHibernate]複数のオブジェクトタイプを1つのテーブルにどのようにマップできますか?

PodcastFeed 
    ChannelData // Property on PodcastFeed 
     ITunesChannelData // Property on ChannelData 
    FeedItems // Property on PodcastFeed; collection of PodcastFeedItems 

PodcastFeedItem 
    ITunesItemData // Property on PodcastFeedItem 

は、PodcastFeed、ChannelDataとITunesChannelData上のフィールドは、すべてのテーブルに格納されています。同様に、PodcastFeedItemとITunesItemDataのフィールドはすべて1つのテーブルに格納されます。 PodcastFeedからPodcastFeedItemへの一対多の関係があります。このようにそれらを格納する理由は、異なるオブジェクトタイプ間に一対一のマッピングが存在するからである(例えば、ChannelDataは各ポッドキャストフィードに固有である)。

PodcastFeedをPodcastFeedItemにマッピングするのは大丈夫ですが、どのように完了できないかは、PodcastFeedを構成するさまざまなクラスに渡ってフィードテーブルのデータを「分割する」方法です。私はNHibernateマッピングをFeedsテーブルからこれらのタイプに正常に作成しましたが、PodcastFeedオブジェクトにアクセスすると、ChannelDataプロパティはnullになります。おそらくこれは、NHibernateが上記のような階層を作成することを知らないためです。

FWIW、私はマッピングファイル内で次の行を試してみました。NHibernateは、テーブルの存在しない "ChannelData"列からデータを読み込もうとします。

<property name="ChannelData" type="ChannelData" /> 

私はこれを有効にするには、NHibernateの中でユーザータイプを作成する必要がありますか、または私はいくつかの組み込みのトリックをしないのですか?

答えて

2

方法はcomponent mappingを使用することです。 <component />マッピング要素を使用すると、<class />レベルで利用可能なマッピングの数を増やすことができ、複雑なシナリオが可能になります。

+0

@alastairs ...新しい文書を指すようにあなたのリンクを更新できますか?リンクが壊れていると表示されます。 –

+0

@RichardB要求通りにリンクを更新しました。 – alastairs

+0

Thx。私は実際にそこに私を得た別のリファレンスガイドを発見した...しかし、これは、stackoverflowの完全性のためには、確かに良いです。 –

0

あなたが探しているものは、TPH、階層ごとのテーブル、マッピングです。これは、オブジェクトの階層にマップされたデータベース内の単一のテーブルを、ある種のキーで区別したものです。

次のドキュメントが役に立つ電子必要があります。これを解決する https://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

+0

私の "diagram"は、オブジェクトの継承階層を記述していないので、他のオブジェクトメンバ(したがって、 "Property on ..."コメント)を持つオブジェクトを記述します。 リンクは役に立ちました。私は実際に前の章であったコンポーネントマッピングの後でした。 – alastairs

+0

ああ、私の謝罪...私はどうにかして "Property"というコメントが気づかなかった:P – jrista

関連する問題