Есть ли способ сохранить объект с помощью Hibernate, если уже есть объект, использующий этот идентификатор, загруженный в сеанс?
session.contains(obj), похоже, возвращает true только в том случае, если сеанс содержит именно этот объект, а не другой объект с тем же идентификатором.merge(obj) вызывает исключение, если объект новый




Вы пробовали вызвать .SaveOrUpdateCopy ()? Он должен работать во всех случаях, если в сеансе есть сущность с таким же идентификатором или если сущность отсутствует вообще. По сути, это универсальный метод, поскольку он преобразует временный объект в постоянный (Сохранить), обновляет объект, если он существует (Обновить), или даже обрабатывает, если объект является копией уже существующего объекта (Копировать) .
В противном случае вам, возможно, придется идентифицировать и .Evict () существующий объект перед присоединением (.Update ()) вашего «нового» объекта. Это должно быть достаточно легко сделать:
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);
?