NHibernate (およびおそらくいくつかのプラグイン) の最新バージョンを使用して、DB リンクなしで異なるサーバー上の複数のデータベース間でエンティティをマップすることは可能ですか?
背景として、このDBA.SE の投稿で説明されているものと大まかに似たものを実装しようとしています。
NHibernate (およびおそらくいくつかのプラグイン) の最新バージョンを使用して、DB リンクなしで異なるサーバー上の複数のデータベース間でエンティティをマップすることは可能ですか?
背景として、このDBA.SE の投稿で説明されているものと大まかに似たものを実装しようとしています。
nhusersメーリング リストで興味深い回答を得ました。抜粋は次のとおりです。
ジェイソン・メックリーより
[...] 単一のエンティティを複数のデータベースに保存することについて話している場合、答えは明確ではありません。オブジェクトをハイドレートするために、カスタム ユーザー タイプやイベント リスナーを使って何かできるかもしれませんが、それを維持するのは面倒です。
別のアプローチは、ETL プロセスを使用して、あるデータベースから別のデータベースにデータを転送することです。レプリケーションに似ていますが、他のデータベースが必要とするデータのみを転送します。1 つの書き込み可能なデータベースと多数の読み取りデータベースが作成されます。次に、ドメインを単一のデータベースにマップします。
もう 1 つのオプションは、複数のデータベースが存在する理由を特定することです。それらが異なるタイプのデータ/オブジェクトを表す場合、ドメインでこれを明示的に表現します。たとえば、CustomerWithAddress は CustomerOrder とは異なるエンティティです。両方からの情報が必要な場合は、各データベースに個別にクエリを実行し、コードでプロジェクションを構築します。
var x = session1.get(id);
var y = session2.get(id);
マージ(x、y)を返します。
グーグルで調べた後(まだ試していませんが)、少なくともクラスを同じサーバー上の異なるデータベースのテーブルにマップできるようです。
<class name="..." table="..." schema="database.schema">
...
</class>
マッピングで。
しかし、サーバーに依存していないように見えるため、これはくだらない解決策です。どうやら、NHibernate はクエリの作成時にスキーマ値をテーブル値と連結するだけであり、ほとんどのサーバーでは、「スキーマを使用してデータベースを配置するだけ」で、HAPPENS が機能する構文が生成されます。しかし、NHibernate がクエリの作成方法を明確に決定できるように、NHibernate に「これはスキーマです」および「これはデータベースです」と明確に伝えていません。
私見ですが、「スキーマ」値に .
とにかく、さらに一歩進んで schema="server.database.schema" を使用できない技術的な理由はないようです。ここで、「server」はリンクされたサーバーの名前です (たとえば、http: //technet.microsoft.com/de-de/library/ms190479.aspx )
その汚いハックは別として、誰もが複数のセッション ファクトリを使用することを推奨しているようです。