2

次のオブジェクト モデルがあります。

  • Element多くの子と子孫を持つトップレベルの抽象クラス。
  • クラスEvent
  • それぞれに s のElement袋が含まれていますEvent
  • それぞれEventに親へのポインターがありますElement

これまでは、かなり標準的な 1 対多の関係でした。

しかし、具体的なクラス戦略ごとにテーブルを使用したい。したがって、クラスElementはデータベースにマップされません。私はこの方法で解決しようとしました: の具体的な子孫のそれぞれがElement独自の Bag of Events を定義します。これの問題は、各<bag>要素に要素が含まれていること<key>です。Parentそのキーは のプロパティを指していますEvent。またParent、s テーブルの列をEvent、Bag を含むテーブルへの外部キーにします。しかし、1 つの列を複数のテーブルの外部キーにすることはできず、挿入時に例外が発生します。

Parentまた、Events テーブルのフィールドを多対任意の種類のフィールドにしようとしました。それはうまくいきました。しかし、リレーションを双方向にしたい場合、つまり の子孫にバッグを追加したい場合Element、同じ問題に戻ります。バッグ => 外部キー => 挿入時の例外。

このケースは見かけほどユニークではないと確信しています。よろしくお願いいたします。

4

1 に答える 1

1

遅くなりましたが、アドバイスをお願いします。

「具体的なクラスごとのテーブル」を使用している場合、完全に独立したテーブルをマップするかのようになります。したがって、個別の外部キーまたは多対多が必要です。

多対多は型名を格納し、NH は外部キーが指している場所を認識します。しかし、そのような外部キーに制約を課すことは不可能です。

同じタイプのアイテムを含む複数のバッグがある場合は、それらすべてが異なる外部キーを定義していることを確認してください。

<class name="A">
  <!-- ... -->
  <bag name="Events">
    <key column="A_FK"/>
    <one-to-many class="Event"/>
   </bag>
</class>

<class name="B">
  <!-- ... -->
  <bag name="Events">
    <key column="B_FK"/>
    <one-to-many class="Event"/>
   </bag>
</class>

このような外部キーには外部キー制約を設定できますが、非 null 制約は設定できません。これは、これらの外部キーの 1 つだけが使用されるためです。

すべての制約を持つ外部キーを実際に 1 つだけ持つには、要素を別のテーブルにマップする必要があります。

于 2009-04-27T08:26:24.360 に答える