セッションにロードされたその識別子を使用するオブジェクトがすでに存在する場合、Hibernateを使用してオブジェクトを保存する方法はありますか?
session.contains(obj)
同じIDを持つ別のオブジェクトではなく、セッションにその正確なオブジェクトが含まれている場合にのみ、trueが返されるようです。merge(obj)
オブジェクトが新しい場合、を使用すると例外がスローされます
.SaveOrUpdateCopy()を呼び出してみましたか?セッションに同じIDのエンティティがある場合、またはエンティティがまったくない場合は、すべてのインスタンスで機能するはずです。これは基本的にキャッチオールメソッドです。一時オブジェクトを永続オブジェクトに変換し(保存)、オブジェクトが存在する場合は更新し(更新)、エンティティが既存のオブジェクトのコピーである場合は処理します(コピー)。 。
それができない場合は、「新しい」オブジェクトをアタッチ(.Update())する前に、既存のオブジェクトを識別して.Evict()する必要があります。これは簡単に実行できるはずです。
IPersistable entity = Whatever(); // This is the object we're trying to update
// (IPersistable has an id field)
session.Evict(session.Get(entity.GetType(), entity.Id));
session.SaveOrUpdate(entity);
上記のコードは、おそらく.Get()呼び出しのnullチェックで実行できます。
どうですか:
session.replicate(entity, ReplicationMode.OVERWRITE);
?