(N)Hibernate - 複数のテーブルを 1 つのクラスに動的にマップすることは可能ですか

StackOverflow https://stackoverflow.com/questions/51654

質問

GIS オブジェクトに関する情報を GIS オブジェクトのタイプ/クラス (道路、川、建物、海など) ごとに個別のデータベース テーブルに保存し、それが保存されるメタデータ テーブルを保持する GIS ソフトウェアを使用している状況があります。クラス名とその DB テーブルに関する情報。

異なるクラスの GIS オブジェクトはいくつかのパラメータを共有します。説明とID。これらのさまざまな GIS クラスをすべて 1 つの共通の C# クラス (GisObject と呼びます) で表現したいと考えています。指定された GIS の GIS オブジェクトをリストするアプリケーションの非 GIS 部分から実行する必要があることにはこれで十分です。クラス。

私にとっての問題は、受信および受信する C# GisObject を作成するときに NHibernate に説明するために、NHibernate を使用してこれらのオブジェクトをマッピングする方法です。 テーブル名をパラメータとして使用します これはメタテーブルから読み取られます(これは 2 つのステップで行うことができます。最初のステップでテーブル名を手動で取得し、GisObject データをプルするときにそれを NHibernate に渡すことができます)。

この種の状況に対処した人はいますか?そもそも対処できるでしょうか?

役に立ちましたか?

解決 2

@ブライアン・チアソン

残念ながら、クラスはアプリケーション内で動的に作成されるため、GIS データのすべてのクラスを作成することはできません。同じタイプのすべての GIS データはクラスである必要がありますが、ユーザーは新しいデータ セットを取得してデータベースに置く可能性があります。ユーザーがアプリケーション内でどのクラスを持つことになるのかを事前に知ることはできません。したがって、明日には別の新しいデータベース テーブルが存在し、新しいマッピングを使用して新しいクラスを作成する必要があるため、クラスごとのインフロント マッピング モデルは機能しません。

@all私のgisobjectクラスのXML構成ファイルに独自のカスタムクエリを記述する可能性があるかもしれません。そして、データアクセスクラスで、

string qs = getSession().getNamedQuery(queryName);

そして文字列 replace を使用してデータベース名を挿入します(プレースホルダー文字列を置き換えることによって)。これをパラメータとして渡します。

qs = qs.replace(":tablename:", tableName);

その解決策についてどう思いますか?テーブル名がユーザー入力としてフェッチされる制御されていない環境では、セキュリティ リスクになる可能性があることはわかっていますが、この場合、事前に読み取る GIS データ クラスの適切で有効なテーブル名を含むメタ テーブルがあります。クエリを呼び出して、GIS オブジェクトの特定のクラスのデータを取得します。

他のヒント

ここで行う最も簡単な方法は、すべての共通 GIS メンバーを含む抽象基本クラスを作成し、必要な NHibernate マッピングのみを持つ他の X クラスを継承することであるように思えます。次に、Factory パターンを使用して、メタデータを使用して特定のタイプのオブジェクトを作成します。

これを行う 1 つの方法は、インターフェース上で宣言された共通プロパティを持つ IGisObject などのインターフェースを宣言することです。次に、各テーブルにマップする具体的なクラスを実装します。そうすれば、それらはすべて IGisObject 型のままになります。

アイエンデ氏の発言はここで見ることができます。 マルチテーブルエンティティ.

しかし、別のテーブルがあるので、うまくいかないと思います。チェックアウトすることもできます nhuserグループ

おそらく、通常は抽象化として提供される API を使用せずに、データベース内の GIS データを直接追跡するのはなぜかという質問をすると思います。これが ESRI システムの場合は、GIS オブジェクトに静的なデータベース ビューを作成できるツールがあり、その点からデータ抽出に適している可能性があります。

NHibernate ドキュメントから、次のいずれかを使用できます。 継承マッピング.

テーブルごとに個別のクラスを用意することもできますが、それらすべてに共通のインターフェイスを実装する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top