私のアプリケーションでNHibernateを使用していて、次のような状況があります。 (ここでの状況は、理解のためにはるかに単純化されていることに注意してください)なぜSessionからオブジェクトを追い出しても、データベースへの変更はコミットされません。
オブジェクトはデータベースから照会されます。 Session.Update()
を使用して編集および更新されます。オブジェクトは、トランザクションがコミットされる前にセッションから退去されます(Session.Evict(obj)
を使用)。予想される結果は、変更がデータベースに保持されることです。
これは、NHibernate identity
カラムとして自分のId
カラムを使用したときに正常に動作していました。 最近、ID列を非同一に変更しました。結果として、前述のシナリオは、Evict前に明示的にSession.Flush()
を呼び出さない限り、データベースに保持されません。
誰かがこの行動の理由を指摘/説明できますか?
このリンクNHibernate Session.Flush & Evict vs Clearは、私にはわかりにくいエビクトとアイデンティティの列について何か言及しています。
ディエゴ、あなたは正しいです。私たちはこのような「悪い」手法に頼らざるを得ませんでした。なぜなら、読み込まれたセッションには多くのオブジェクトがロードされていたからです。トランザクションがコミットされると、変更が進むまでに時間がかかりました。したがって、オブジェクトを照会した後にオブジェクトを追い出すと、セッション内のオブジェクトを減らすことができると考えました。後で更新されるオブジェクトは、自動的にセッションに自動的に再接続されます。 私たちの最初の間違いは、このためにNHibernateを使用することでしたが、私たちのシステムからそれを削除できるようになるまで、私たちは物事をスピードアップするためのいくつかの回避策を探しています... – Zuber
この特定の問題は、更新は何とかデータベースにフラッシュされ、オブジェクトを暴露した後でさえ、私はその変更を見ることができた。 NHibernateのAutoFlushは、ID列に依存するいくつかのロジックを使用していましたか? ところで、これはWebアプリケーション内にあるので、すべてのリクエストに対してセッションを作成し、最後にコミットします。このアプリは、ユーザーが独自のIronPythonスクリプトを作成するminsalesforce.comのようなものです。それは、私たちがEvictするセッションに多くの読み込み専用オブジェクトを追加したことです。それは我々にいくつかのパフォーマンスをもたらしました。 – Zuber
私は、これらのエビクトが起こる前にセッションをフラッシュすることによって、この特定の問題を解決しました。このコードは広範囲に呼び出されるわけではないので、今は大丈夫です。 しかし、我々のプロジェクトのための最善の勧告は、この層のNHibernateを置き換えることです – Zuber