Почему я должен к explicitely сохранить после того, как находка с Будет в спящем режиме?

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

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 ("Рокер!");
  3. ta.commit ();

ОБНОВЛЕНИЕ 2

Решение проблемы: Я использую облик / деформация сохраняется. И в некоторых случаях я был неправильно связан блок кода с транзакцией через @Transactional: таким образом, транзакция фиксировалась слишком рано открытая, и следовательно отдельное изменение не было включено в фиксацию.Спасибо, ребята! Так, всегда удостоверяйтесь, что Вы знаете о своей области транзакций в случае, если Вы используете пружину или облик...

5
задан rocker 14 July 2010 в 13:44
поделиться

1 ответ

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

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

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

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

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

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

5
ответ дан 14 December 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: