2009-08-26 6 views
1

私はいくつかのテーブル継承を行っていますが、すべてがうまくいっていますが、私はベースエンティティ(ベーステーブルデータ) (関連テーブル)NHibernate 2.1を使用してテーブル継承を回避する方法

デフォルトの動作を設定して、必要なデータのみを照会する方法 - 親要素のリストが必要な場合(クエリのみ)私はその要素です。

今私のマッピングは以下のようになります。

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="FormBase, ClassLibrary1" table="tbl_FormBase"> 
    <id name="BaseID" column="ID" type="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <property name="ImportDate" column="ImportDate" type="datetime" not-null="false" /> 
    <joined-subclass table="tbl_Form" name="Form, ClassLibrary1"> 
     <key column="ID"/> 
     <property name="gendate" column="gendate" type="string" not-null="false" /> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

そして、私は戻って、親エンティティ対のすべてのデータが欲しいの例を以下に示します。

Dim r As New FormRepository() 
    Dim forms As List(Of Form) = r.GetFormCollection().ToList() 



    Dim fbr As New FormBaseRepository() 
    Dim fb As List(Of FormBase) = fbr.GetFormBaseCollection().ToList() 

答えて

2

することができます」 t。これは "暗黙的な多態性"と呼ばれ、Hibernateによって提供される(あなたのケースでは望ましくないにもかかわらず:-))かなり良い機能です。ベースオブジェクトのリストを照会すると、返される実際のインスタンスは実際の具体的な実装になります。したがって、Hibernateが特定のエンティティがFormBaseかFormかどうかを調べるには、左への結合が必要です。 (コメントに収めるには大きすぎる)

更新: ここでの一般的な問題は、読み込みに休止状態だましていた場合のみ、基本エンティティを使用すると、一貫性のないセッション状態になってしまうかもしれないということです。 (つまり、両方form_baseformのテーブルに永続化される)何とかFormBaseとしてロードされた

  1. Formインスタンス:以下を検討してください。
  2. 削除しました。
  3. フラッシュ中Hibernate(これは、FormBaseを扱っていると考えているため、2つのテーブルがあることに喜んで気づいていません)は、DELETE FROM formという文を発行し、FKが違反すると例外をスローします。

暗黙的ポリモーフィズムが起こってからそれを防ぐために存在している - Formは常にForm、決してFormBaseです。もちろん、すべてが同じテーブルにあり、結合が必要ない「階層ごとのテーブル」マッピングを使用することもできますが、(潜在的に)たくさんのNULLカラムで終わるでしょう。子供のプロパティではnullではない

これは本当にあなたのための巨大なパフォーマンスの問題であれば、言ったすべての(それが正常にされるべきでない - おそらくそれが参加インデックスされます)、あなただけFormBaseのインスタンスを返すために、ネイティブクエリを使用して試みることができます。

+0

Ahh ... - 子ではなくそのエンティティを照会すると、基底テーブルを別に保つこの継承の問題に対する別のアプローチがありますか? (今はそれぞれの子要素に独自のテーブルがあります) –

+0

私は上記のコメントを更新しました - コメントにあまりにも多くのものを入れてください – ChssPly76

+0

私はそれが私のPOCの現在大きな問題だとは思わないが、この基本クラスはほとんど継承されています私のプロダクションアプリケーションでは他の12のクラス...だから私はちょっと心配しています(あなたが言及した通りにすべきではない - それぞれがインデックス付きの結合になる) –

関連する問題