6

私はNHibernateに比較的慣れていませんが、最近のいくつかのプログラムで使用しており、大好きです。4 ~ 5 つのデータベースのデータを 1 つのデータベースに集約する必要がある状況になりました。具体的にはシリアルナンバーデータです。各データベースには独自のマッピング ファイルがありますが、最終的にはすべてのエンティティが同じ基本構造 (シリアル クラス) を共有します。

NHibernate がクラスごとのマッピングを必要としていることは理解しています。そのため、最初に考えたのは、ベースとなるシリアル クラスを用意し、それを異なるデータベースごとに継承して、一意のマッピング ファイルを作成することでした (継承されたクラスにはコンテンツがありません)。これは、すべてのデータを取得してオブジェクトを設定するのに最適です。私が次にやりたいことは、これらの継承されたクラス (適切な用語が何であるかはわかりません) を、基本クラス マッピングを使用して基本クラス テーブルに保存することです。

問題は、オブジェクトに特定のマッピング ファイルを使用するよう NHIbernate に強制する方法がわからないことです。「session.save()」を使用する場合、継承されたクラスを基本クラスにキャストしても何も起こりません (マッピングがないことを訴えます)。

使用するマッピングを明示的に指定する方法はありますか? または、継承されたクラスを基本クラスにキャストするために欠落している OOP プリンシパルがいくつかありますか? それとも、このアイデアは単に悪いものですか。

NHibernate (第 8 章) に関して私が見つけたすべての継承は、この関数に完全に適用できるようには見えませんが、間違っている可能性があります (table-per-concrete-class はおそらく便利に見えますが、私はできます. NHibernate が何をすべきかをどのように判断するかについては、完全に理解できません)。

4

5 に答える 5

4

これが役立つかどうかはわかりませんが、基本的にはそうしようとはしていません。

基本的に、あなたはおそらく「ゴールドハンマー」症候群に苦しんでいると思います。本当に本当に素晴らしいハンマー(つまり、冬眠(そして私はそれについてあなたの意見を共有します;それは素晴らしいツールです))を持っているとき、すべてが釘のように見えます。

私は通常、単に「手動変換」クラス、つまり、個々のシリアルクラスの休止状態クラスを取得し、データを独自の特定の形式にコピーするコンストラクターを持つクラスを作成しようとします。次に、Hibernateは、独自のマッピングを使用して、それを(単一の)データベースに単純にシリアル化できます。

事実上、これがより良い解決策であると私が考える理由は、あなたが効果的にやろうとしているのは、クラスで非対称シリアル化を行うことだからです。つまり、派生クラスの1つのデータベースから読み取り、基本クラスの別のデータベースに書き込みます。基本的に一方向のプロセスであることを除けば、それについてそれほど恐ろしいことはありません。あるデータベースから別のデータベースへの変換が本当に必要な場合は、変換を実行して、それで終わりです。

于 2008-11-12T00:42:46.127 に答える
2

これは役立つかもしれません。

複数のデータベースで NHibernate を使用する

記事から;

序章

... ASP.NET で NHibernate を使用して説明。単一のデータベースと通信するためのガイドラインを提供しました。 ただし、複数のデータベースと同時に通信する必要がある場合もあります。NHibernate がこれを行うには、通信するデータベースごとにセッション ファクトリが存在する必要があります。ただし、複数のデータベースでよくあることですが、一部のデータベースはめったに使用されません。そのため、実際に必要になるまでセッション ファクトリを作成しないことをお勧めします。この記事では、以前の ASP.NET を使用した NHibernate の記事の続きを取り上げ、この単純なアプローチの実装の詳細について説明します。前回の記事では ASP.NET に焦点を当てましたが、以下の提案は ASP.NET と .NET の両方でサポートされています。

...

複数のデータベースを操作するときに最初に行うことは、適切な通信を構成することです。データベースごとに個別の構成ファイルを作成し、それらをすべて中央の構成フォルダーに配置してから、web/app.config から参照します。

...

于 2008-11-12T01:15:25.933 に答える
0

これが私が必要とすることを100%確信しているわけではありませんが、今日、NHibernateと匿名型についてこれをグーグルで見つけました:

http://infozerk.com/averyblog/refactoring-using-object-constructors-in-hql-with-nhibernate/

興味深い部分 (私にとっては初めてです) は、HQL select 句の 'new' キーワードです。したがって、mappingX を使用して DatabaseX から SerialX を選択し、それを SerialY (一般/基本シリアル) のコンストラクターに渡すことができます。これで、SerialY が mappingX/databaseX から生成されました。(うまくいけば) session.save ができ、NHibernate は mappingY/databaseY を使用するようになります。

私がこれを気に入っている理由は、同じデータを永続化する 2 つのクラスを持たないことです (私はそう思います!)。これとSerialXのリストを返し、それを繰り返してSerialYを生成し、新しいリストに追加することとの間に機能的な違いはありません(最初の最良の答えが与えられました)。

これには、継承による NHibernate マッピングの有用なケースを作成するというより一般的な利点はありませんが、私が望む限られた機能を実行すると思います。

于 2008-11-14T21:23:53.150 に答える
0

これらのテーブルごとにマッピング ファイル/クラスが必要になるのは事実ですが、これらのすべてのクラスに共通のインターフェイスを実装することを妨げるものは何もありません。

次に、それらをすべてまとめて、アプリケーション層 (つまり、List) で単一のコレクションにまとめることができます。ここで、これらのクラスのそれぞれが List を実装します)。

更新を行う場合は、(複数のデータベースをターゲットにしているため) どのセッションに保存するかを追跡するために、配管を作成する必要があるでしょう。ただし、それを行うプロセスは、設定方法によって異なります。

于 2008-11-14T23:01:01.067 に答える
0

ダンに返信するために、コードとすべてを含む非常に長い投稿を書きました。結局、私は明らかなことを逃したと思います。

public class Serial
{
    public string SerialNumber {get; set;}
    public string ItemNumber {get; set;}
    public string OrderNumber {get; set;}
}

...

Serial serial = sessionX.get(typeof(Serial), someID);
sessionY.save(serial);

セッションは共有されておらず、マッピングはセッションに関連付けられているため、Hibernate は get に mappingX を使用し、save に mappingY を使用する必要があります。したがって、特定のセッションではクラス関係へのマッピングが 1 つしかないため、同じクラスを指す 2 つのマッピングを持つことができます。

少なくともそうだと思います(atmをテストできません)。

残念ながら、この特定のケースは本当に退屈で役に立ちません。同じドメインの別のプログラムで、ビジネス ロジックの特定の部分の基本クラスから派生させます。コードの小さなチャンクを簡単にするためだけだったので、マッピング ファイルを作成しませんでした。とにかく、最初の質問と同じ理由で NHibernate で動作させることができず、McWafflestix がそれを回避するために説明した方法を実行しました (それはマイナーだったので)。

それは私がグーグル経由でこれを見つけたと言った:

http://jira.nhibernate.org/browse/NH-662

それはまったく同じ状況であり、(おそらく) NH 2.1+ で対処されているように見えますか? 私はまだそれをフォローアップしていません。

(注:ダン、私の場合、私はいくつかのデータベースから取得しており、1つだけに書き込みを行っています。他のケースでは良い考えだと思うので、インターフェイスに関するあなたの提案にまだ興味があります。インターフェイス?マッピング定義を持たないインターフェイスを実装するクラスを保存しようとすると、NHibernate はインターフェイス マッピングを使用しますか?またはインターフェイス マッピングを実装する各クラスのマッピングで空のサブクラスを宣言する必要がありますか?)

于 2008-11-15T01:57:17.777 に答える