Hibernate saveOrUpdate с другим объектом в сеансе - PullRequest
1 голос
/ 25 августа 2008

Есть ли способ сохранить объект, используя Hibernate, если уже есть объект, использующий этот идентификатор, загруженный в сеанс?

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

Ответы [ 2 ]

4 голосов
/ 25 августа 2008

Вы пытались вызвать .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 ().

1 голос
/ 03 сентября 2008

Как насчет:

session.replicate(entity, ReplicationMode.OVERWRITE);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...