Зачем мне явно сохранять после поиска с Hibernate? - PullRequest
5 голосов
/ 14 июля 2010

Зачем мне нужна строка "session.save (user);"в следующем фрагменте кода?Я думал, что с помощью вызова find пользователь уже подключен к сеансу, и изменения будут отслеживаться и фиксироваться.Не могли бы вы объяснить мне детали?Или мне нужна особая конфигурация или другие обстоятельства, когда я мог бы услышать об этой «функции»?

session = createSession();
ta = session.beginTransaction();
assertEquals(1, session.createCriteria(MyUser.class).list().size());
// find one user
MyUser user = session.createCriteria(MyUser.class).uniqueResult();
user.setName("Rocker!");
// ### HERE ###
// WHY this 'save' is necessary!!??
session.save(user);
ta.commit();

ta = session.beginTransaction();
assertEquals(1, session.createCriteria(MyUser.class).list().size());
MyUser user = session.createCriteria(MyUser.class).uniqueResult();
assertEquals("Rocker!", user.getName());
ta.commit();

ОБНОВЛЕНИЕ 1

Тот же вопрос относится к

  1. session.save (пользователь);
  2. user.setName ("Rocker!");
  3. ta.commit ();

ОБНОВЛЕНИЕ 2

Решение проблемы: я использую guice / warp persist.И в некоторых случаях я был неправильно привязан блок кода к транзакции через @Transactional: поэтому транзакция была зафиксирована слишком рано, и, следовательно, отдельное изменение не было включено в фиксацию.Спасибо, парни!Поэтому всегда проверяйте объем транзакции, если вы используете spring или guice ...

1 Ответ

5 голосов
/ 14 июля 2010

Вы правы, что hibernate должен автоматически обнаруживать изменения в состоянии постоянных объектов:

Постоянный - постоянный экземпляр имеет представление в базе данных и значение идентификатора. Возможно, он просто был сохранен или загружен, однако по определению он входит в область действия сеанса. Hibernate обнаружит любые изменения, внесенные в объект в постоянном состоянии, и синхронизирует состояние с базой данных после завершения единицы работы. Разработчики не выполняют ручные операторы UPDATE или операторы DELETE, когда объект должен быть временным.

Я бы предположил, что результаты критериев не возвращаются в постоянном состоянии (но я не могу найти доказательства этого в документации)

Попробуйте использовать HQL-запрос, для которого документы понятны:

Экземпляры сущностей, полученные по запросу, находятся в постоянном состоянии

Также убедитесь, что режим сброса сеанса установлен на AUTO или COMMIT.

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