2

私のアプリケーションは、ソケット接続を介して頻繁にリモートイベントを受信し、それぞれが新しいスレッドを開始します。その後のアクションにより、同じオブジェクトグラフがトリガーされ、1つのロックされた静的セッションで毎回保存されます。ただし、その保存が実行されている間に、同じオブジェクトグラフに新しい要素を追加する新しい更新が受信されることがあります。これが例外の理由であると私は信じています:

TransientObjectException
object references an unsaved transient instance - 
save the transient instance before flushing.  

それが理由なら、それは理解できます。しかし、どうすればこの例外を防ぐことができますか?トランザクションをロールバックさせると、StaleStateObject、NonUniqueObjectExceptionなどの後続の例外が発生します。

では、これをどのように処理または防止できますか?

4

2 に答える 2

1

エラーを防ぐには2つの方法があります。

  • Save()新しく作成された参照オブジェクトを手動で
  • 上記が自動的に行われるように、関係に適切なcascade設定をセットアップします(私は個人的にこれを好みます)

もちろん、既存のオブジェクトを参照しようとしたときに新しいオブジェクトを作成している可能性もありますし、ロックがあってもスレッドの問題がある可能性もあります。

于 2012-07-26T02:38:06.167 に答える
-1

この例外が、SaveOrUpdate(別のスレッド)中にコレクションを反復処理しているときにエンティティコレクションが変更されていた場合に発生する可能性があります。したがって、これらの同時アクションを回避するには、ロックを設定する必要があると思います。

于 2012-08-17T09:49:40.283 に答える