2016-04-03 15 views
0

オブジェクトの状態をINSERTクエリを使用して追加すると、オブジェクトの状態はどうなりますか?そして、どのように私はこのオブジェクトを同じセッションを得ることができますか?私は取得のためにこれを使用して、自分のIDがわかっているネイティブSQLCreateSQLQueryを使用してNHibernateでINSERTクエリを使用する

session.CreateSQLQuery("INSERT INTO table (...) VALUES (...)").ExecuteUpdate()) 

を使用して

オブジェクトの挿入:セッションが同じであるため、

sessison.Get<MyObjectType>(id) 

が、オブジェクトがnullで、コミットはまだ保留されています。 私は何が間違っていますか?

P.S.私の子オブジェクトfooは親バーに基づいて作成されているので、barとfooは同じIDを持ち、コンクリートクラスを使用しているため、

+0

これは私にとっては正常ではありません。生のSQLレベルでは、保留中のデータを持つトランザクションを読み込んでいる場合、コミットされていないデータを任意の分離レベルで読み取ることができます。 'ExecuteUpdate'をチェックすると、すぐにクエリをdbに送ることになっています。あなたのケースではプロファイラーでそれをチェックしてもよろしいですか?あなたのセッションで同じIdを持つ失効したエンティティを持つのと同じように、あなたが新しいエンティティを見つけることができるはずです。 NHibernateのデバッグlog4netログを有効にし、 'DefaultLoadEventListener'からのログはあなたに詳細を与えるでしょう。 –

+0

いいえ、ExecuteUpdateの後、プロファイラはi 'を挿入しますがコミットは送信しません。私はそれがISessionProviderのライフスタイルに依存していると思う –

+0

ちょうど挿入を送ることは私がプロファイラで見たいと思っていたものでした。とにかく、あなたのコメントは、あなたが何かを見つけたことを伝えていますが、おそらくそれを自分自身の答えとして追加する必要があります(ここでは/ questions/36386613/using-createsqlquery-with-nhibernate?noredirect = 1#comment60434278_36388601)質問し、それを受け入れる。あるいは、なぜあなたの変更によってコードが動作するのかわからない場合は、新しい質問をするべきでしょうか。 –

答えて

0

解決策が見つかりました。

私の場合、ISessionProviderのライフスタイルはperWebRequestです。これは、エンドWebリクエスト後にセッションがコミットされることを意味します。

次。挿入後、エンティティはありませんが、挿入するデータに基づいて作成された新しいエンティティを現在のセッションとマージできます。

session.Merge(new Entity(...)); 

か、Persistence Contextで親エンティティを持っている場合、あなたはそうする必要がありますいくつかのIDを持つ

session.Evict(parentEntity); 
session.Merge(new Entity(...)); 

Evict削除エンティティ(子と親が、いくつかのIDを持っている)、それ以外の例外が発生します。 これは現在のセッションとエンティティをマージし、sessison.Get<MyObjectType>(entityId)を使用するとオブジェクトはnullになりません。

0

.Getを試すか、更新または挿入の前にこのエンティティを別のエンティティに関連付ける必要がある場合のみ、.Loadを入力してください。

エンティティを処理していないので、未処理のSQLクエリを記述しても、セッション中のものは保存されません。

+0

私は少し驚いています。この同じトランザクション内で読んでいる場合、現在保留中のトランザクションに追加されたデータを読み取ることはできませんか?通常、トランザクションをコミットする必要はありません。 'ExecuteUpdate'は' Flush'だけで実際に実行されますか? (すでにロードされているエンティティのSQLの更新の場合は、セッションからエンティティを削除する必要があります。) –

+0

データを読み取るときに使用するトランザクション分離レベルによって異なります。これを行うには、コミットされていないデータを読み取るよう明示的に設定する必要があります。これは、更新/挿入がまだ保留中のトランザクションのデータベースに実際に送られたと仮定しています。 –

+0

あなたは私に疑問を抱かせるが、読んでテストすることは 'begin tran; Parametre(Code)の値( 'test')を挿入します。 *パラメタから選択*ロールバック。 select * from parametre; 'は、2番目のケースでは1つ少ない結果しか得られません。これは、まだ同じトランザクション内にある場合、保留中のデータを読み取るためにコミットされていない読み取りを必要としないことを意味します。そして、インサートの場合、なぜNHibernateの第1レベルのキャッシュが干渉するのか分かりません。 –

関連する問題