2011-01-17 12 views
5

NHibernateのSessionはPersist()メソッドを2つのオーバーロードで公開します。私はどこでもこのメソッドのドキュメントを見つけることができません。それはhttp://nhibernate.info/doc/nh/en/index.htmlのNHibernateの参考資料でも言及されていません。NHibernateのISession.Persist()のドキュメントはどこにありますか?

このメソッドは推奨されていませんか?いつ使用されるのですか? SaveOrUpdate()とどのように比較しますか?

いずれのポインタも大歓迎です。

答えて

4

このスレッドhttp://opensource.atlassian.com/projects/hibernate/browse/HHH-1273上の最後のコメントは非常によく、それを指定しています。

は(存続)が明確に定義されています。これは、 一時インスタンスを永続化します。 ただし、 の識別子値が永続インスタンス にすぐに割り当てられることを保証するものではありません。 割り当てはフラッシュ 時に発生する可能性があります。スペックはそれを言っていません。それは が私がpersist()で持っている問題です。

persist()は、 がトランザクション 境界外で呼び出された場合、INSERTステートメントを実行しないことを保証します。これは、 拡張セッション/永続コンテキスト で長時間実行される会話で役に立ちます。

persist()のようなメソッドが必要です。

(保存)同じことを保証するものではありません、それは は、識別子を返し、 INSERTが 識別子(例えば、「アイデンティティ」ジェネレータ、 ない「順序」)を取得するために実行しなければならない場合、このINSERTが起こります であるかどうかにかかわらず、すぐに に連絡してください。 長時間実行中の 会話では、これは拡張されたセッション/永続コンテキスト ではよくありません。

また、カスケード= "存続"のエンティティがコール時にカスケードすることは、他のソースから集めることができたようです。それも非常に便利かもしれません。

+1

これは優れた発見です。ありがとうございました。私は実際にはPersist()..の代わりにSaveOrUpdate()を使うべきだと思うが、Persist()は確かに特定のシナリオで役に立つかもしれない。今、FluentNHibernateでカスケード= persistを指定する方法しか見つけられないのなら、助けてくれてありがとう! –

関連する問題