セッションにロードされた識別子を使用するオブジェクトがすでに存在する場合、Hibernateを使用してオブジェクトを保存する方法はありますか?セッション内の別のオブジェクトを持つHibernate saveOrUpdate
- Doing
session.contains(obj)
は、同じIDを持つ別のオブジェクトではなく、正確なオブジェクトがセッションに含まれている場合にtrueを返します。 - オブジェクトが
セッションにロードされた識別子を使用するオブジェクトがすでに存在する場合、Hibernateを使用してオブジェクトを保存する方法はありますか?セッション内の別のオブジェクトを持つHibernate saveOrUpdate
session.contains(obj)
は、同じIDを持つ別のオブジェクトではなく、正確なオブジェクトがセッションに含まれている場合にtrueを返します。新しい場合merge(obj)
を使用すると、例外がスローされます)(あなたは.SaveOrUpdateCopyを呼び出してみましたがありますか? セッション内に同じIDのエンティティが存在する場合、またはエンティティがまったく存在しない場合は、すべてのインスタンスで動作するはずです。これは一時的なオブジェクトを永続オブジェクトに変換(保存)し、オブジェクトが存在する場合(Update)、エンティティが既存のオブジェクトのコピーである場合は処理する(コピー)、一時的なオブジェクトを永続オブジェクトに変換する。
それに失敗した場合は、「新しい」オブジェクトをアタッチ(.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()の呼び出しのためにいくつかのヌルチェックを行うことができますが。
方法について:
session.replicate(entity, ReplicationMode.OVERWRITE);
?