Hibernate Transaction или постоянные изменения объекта - PullRequest
0 голосов
/ 22 июля 2011

Я разрабатываю приложение 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 отсутствуют.

Итак, мои вопросы:

  1. Неужели я дико не понял?какая-то концепция транзакций гибернации?
  2. Почему при добавлении вызова в другой транзакционный класс conService мой первоначальный объект теперь начинает сохраняться
  3. Почему изменения в объекте Team не сохраняются?(obv Я не хочу делать этот код здесь, но интересно понять, что именно происходит)

Спасибо

1 Ответ

0 голосов
/ 30 июля 2011

Хорошо, кажется, что добавление вызова к другому классу обслуживания было красной селедкой - казалось, что большая часть постоянства была немного ненадежной, и если я очищаю проект и перезапускаю сервер, то оригинальный код работает правильно.

Кто-нибудь еще нашел это? Я использую Elcipse Gallileo и Tomcat.

...