Я разрабатываю приложение Spring / Hibernate и вижу некоторое неожиданное поведение при попытке обновления существующих объектов.
В настоящее время у меня есть метод класса обслуживания, который просто обновляет объект следующим образом:
@Transactional
public void updateToDoCompletion(long id, boolean completed){
ToDo todo = getEntityManager().find(ToDo.class, id);
if (todo!=null){
todo.setCompleted(completed);
}
}
Насколько я понимаю, транзакция запускается вокруг метода, объект ToDo загружается (в рамках транзакции), и тогда любые изменения, которые я внесу в этот объект, будут сохранены после завершения транзакции (вв этом случае метод вызывается извне транзакции, в моем классе контроллера, поэтому я ожидаю, что транзакция будет длиться только для этого метода).
Однако, выполнив все вышеперечисленные изменения в объектеникогда не сохраняются в базе данных.
Интересно, что это обновление в конце транзакции работает в других местах практически с идентичными настройками (с точки зрения ожидаемых границ транзакций и т. д.), поэтому я экспериментировал с кодом и обновилметод следующим образом:
@Transactional
public void updateToDoCompletion(long id, boolean completed){
ToDo todo = getEntityManager().find(ToDo.class, id);
if (todo!=null){
todo.setCompleted(completed);
}
Team t = conService.loadTeam(50l);
t.setDescription("test description!");
}
На этот раз, после внесения изменений в исходный объект, я загрузил другой объект и внес изменения в него - я сделал это как единственное отличие, которое я мог видеть в других методах, которые работали, как ожидалось, если бы онивыполнял вызовы транзакционных методов в других классах (поэтому добавленный код conService.loadTeam (50l) является транзакционным методом в другом классе обслуживания).Теперь первоначальные изменения в объекте ToDo сохраняются, как я и надеялся, но изменения в объекте Team отсутствуют.
Итак, мои вопросы:
- Неужели я дико не понял?какая-то концепция транзакций гибернации?
- Почему при добавлении вызова в другой транзакционный класс conService мой первоначальный объект теперь начинает сохраняться
- Почему изменения в объекте Team не сохраняются?(obv Я не хочу делать этот код здесь, но интересно понять, что именно происходит)
Спасибо