3

NHibernateで一時的な状態テーブルを実装する方法に関するヒント/ポインター/リンクを誰かが提供できますか?つまり、各エンティティテーブルには、この行が有効であると見なされる時間間隔を説明するstart_date列とend_date列があります
ユーザーが新しいエンティティを挿入すると、start_dateは「now」を受け取り、end_dateはnullになります(または、はるか先の日付ですが、まだ決定していません)。
更新するときに、UPDATEクエリを次のように変更したいと思います。

  1. このエンティティの行のend_dateを更新し、
  2. 現在の日付/時刻とnullのend_dateを含む新しい行を挿入します。

イベントリスナーを使用して1のUPDATEクエリを手動で作成しようとしましたが、2の新しいINSERTクエリを実装する方法がわからないようです。

これは適切な方法ですか?それとも私はここで完全にオフマークですか?

4

4 に答える 4

2

実際には、私が働いていれば有効な解決策がありますが、それは事実上、休止状態のメカニズムの一部を殺します。

「一時エンティティ」の場合、NH は挿入/選択エンジンとしてのみ機能します。削除と更新は、NH の ORM 部分が便利な別のユーティリティによって行われます。

少数の一時的なエンティティしかない場合は、nhibernate のみを使用できますが、状態の関係が有効であることを確認するために独自のコードを作成する準備をしてください。私たちは最初の試行でそのルートをたどりましたが、時間エンティティの数が増え始めた後、メカニズムは事実上壊れました。

現在、挿入には特別なツールは必要ありません。値を適切な日時プロパティに配置するだけで設定は完了です。フィルターを使用して選択を実装します(例があるため、NH ref の 16.1 を確実に確認します、条件で BETWEEN を使用してはなりません)。. それを行うには、 http://savale.blogspot.com/2010/01/enabling-filters-on-mapped-entities.htmlで私の投稿を確認してください。

マッピングで(フィルターの代わりに)「where」句を指定しても機能する可能性がありますが、まだ試したりテストしたりしていません。マッピングでマッピングされた「where」がパラメーターをサポートしていないことを理解しています(少なくとも公式ではありません)。

余談ですが、更新/削除にカスタム ツールを使用する理由は、Richard Snodgrass の一時データベースに関する本を読むと明らかになりますhttp://www.cs.arizona.edu/~rts/publications.html

質問に直接答えるには、NULL _end 値と遠い将来の値の両方が機能します (ただし、ISNULL で確認する必要がないため、クエリが簡単になる NOT-NULL ソリューションをお勧めします)。

更新の場合、元のエンティティのクローンを効果的に作成し、元のエンティティの _end を現在に設定してから、クローンに移動して関連するプロパティを変更し、_start を現在に変更し、_end を将来の値に変更します。

于 2010-10-26T07:22:03.240 に答える
1

Martin Fowlerの優れたtimeNarrativeをお勧めします。

于 2009-10-28T10:05:10.390 に答える
0

この記事は数年前のものですが、パターンはまだ有効なようです。私はまだこれを使用していませんが、現在のプロジェクトで同様のソリューションが必要であり、ここで説明する方法でモデル化する予定です。

于 2011-09-14T17:34:46.647 に答える
0

最善のアプローチは、Javaマップ(申し訳ありませんが、私はJavaプログラマーです)のようなものを用意し、NHibernateにそれをマップさせることだと思います。マップは、「開始」フィールドと「終了」フィールドを持つ期間のようなものを値にマップします。UserTypeを記述して、期間を2つの異なるデータベース列にマップできます。

于 2010-10-25T21:05:58.213 に答える