2009-07-19 12 views
56

NHibernateのSaveOrUpdateとSave/Updateの違いは何ですか?なぜ、あなたは常にSaveOrUpdateを使用しませんでしたか?また、SaveOrUpdateCopyのポイントは何ですか?SaveOrUpdate対NHibernateでの保存

答えて

67

第9章は、私ができるよりも、この優れたすべてをカバー:

http://nhibernate.info/doc/nh/en/index.html

しかし、崖のノート:

Save()は識別子せずに新しいオブジェクトを受け取り、セッションにそれを添付します。オブジェクトはINSERT 'となります。

Update()は、識別子を持ちますがセッションには存在しない既存のオブジェクトを取り、それをセッションに接続します。オブジェクトはUPDATE 'となります。

SaveOrUpdate()は、識別子を見て、上記で必要なものを決定します。

SaveOrUpdateCopy()は、同じ識別子を持つ2つのオブジェクト(セッションに1つ、オブジェクトには1つ)があるという点で特別です。試してみると、セッションに含まれていないものがupdateの場合、例外が正常にスローされます(セッションに同じ永続オブジェクトを表す2つのオブジェクトをアタッチしようとしています)。 SaveOrUpdateCopy()は、非セッションオブジェクト状態をセッションオブジェクト状態にコピーする。

どのようにNHを使用するのか分かりませんが、多くの場合、必要なのはSave()です。セッションは何を更新する必要があるかを知るために必要な作業をすべて実行しており、必要なものはすべてまたはCommit()です。

+2

通常、SaveOrUpdate()は必要ありません。なぜなら、NHibernateはロードされたすべてのオブジェクトに変更を追跡するからです。オブジェクトを更新するには、Session.Get()を使用して、Session.Flush()を呼び出して変更します。 –

+0

'SaveOrUpdate()'または 'Flush()'/'Commit()'というコードでは、もっと読みやすく意図的なコードは何ですか?それとも(意味論的なものであれ他のものであれ)違いはありませんか? –

+0

セッションを明示的にフラッシュする必要はないでしょう。トランザクションをコミットするか、セッションがスコープから外れた場合、または変更が破棄された場合、変更は自動的に永続化されます(何らかの理由で、ID生成などが必要な場合は早めに)。フラッシュは、読んだアイシングや他のエソテリカのために自動的に変更を強制する必要があるときに意図を明らかにする(私にとって) NHに精通している人なら、添付されたエンティティのための暗黙の 'Update'も理解するでしょう。したがって、私は明示的な' SaveOrUpdate'ステートメントと同じように思う傾向があります。 –

関連する問題