Почему мне нужна строка "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
Тот же вопрос относится
ОБНОВЛЕНИЕ 2
Решение проблемы: Я использую облик / деформация сохраняется. И в некоторых случаях я был неправильно связан блок кода с транзакцией через @Transactional: таким образом, транзакция фиксировалась слишком рано открытая, и следовательно отдельное изменение не было включено в фиксацию.Спасибо, ребята! Так, всегда удостоверяйтесь, что Вы знаете о своей области транзакций в случае, если Вы используете пружину или облик...
Вы правы, что hibernate должен автоматически обнаруживать изменения состояния постоянных объектов:
Постоянный - постоянный экземпляр имеет представление в базе данных и значение идентификатора. Он может быть просто сохранен или загружен, однако, по определению, он находится в области действия сессии. Hibernate обнаружит любые изменения, внесенные в объект в персистентном состоянии, и синхронизирует состояние с базой данных после завершения работы. Разработчики не выполняют вручную операторы UPDATE или DELETE, когда объект должен стать переходным.
Я бы предположил, что результаты критериев не возвращаются в постоянном состоянии (но я не могу найти подтверждения этому в документации)
Попробуйте использовать HQL-запрос, для которого в документации четко сказано:
Экземпляры сущностей, полученные запросом, находятся в постоянном состоянии
Также убедитесь, что режим промывки сессии установлен на AUTO
или COMMIT
.