Спящий режим с использованием аннотации транзакции требует сброса после большинства, если не всех запросов - PullRequest
1 голос
/ 22 декабря 2010

Итак, мы используем аннотацию, чтобы указать, что для класса требуется транзакция, подобная этой:

@TransactionAttribute (TransactionAttributeType.REQUIRED)
public class Foo() {
...
}

В битах кода этого класса, которые фактически вносят изменения в базу данных, мы обнаружили, что эти измененияне были видны другим частям кода в этом классе, иногда даже следующей строке.Таким образом, нам удалось заставить все работать, очистив запрос, и это действительно странно.Я ожидал, что из-за аннотации транзакция будет работать правильно, но нам кажется, что нам приходится много массажировать, чтобы заставить ее работать.

Я потратил много времени на поиск в Google иТо, что я нашел, относится к использованию этой аннотации в XML-файле, а не прямо в коде.Я надеюсь, что кто-то может либо объяснить поведение кода, либо, по крайней мере, указать мне на веб-сайт, который на самом деле имеет дело с аннотацией @.

Редактирования: Мы используем JBoss и hibernate, и вотбыстрый пример кода, который не работает

System.out.println("before:" + some_obj.getName());
util = (UtilFacade) EJBFactory.lookup(UtilFacadeBean.class);
some_object.setName("changed");
util.persistEntity(some_obj);
util.refreshEntity(some_obj); // reloads the object to get fresh data
System.out.println("after:" + some_obj.getName());

Вывод этого кода выглядит следующим образом:

>>before:start name
>>after:start name

, но мы ожидали, что второй код покажет >> после: изменено

Нам удалось обойти это, добавив util.flush ();после вызова util.persistEntity ().

Для вызовов util используется EntityManager, использующий hibernate API.

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

заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Я не уверен, что делает UtilFacade, но если persistEntity() звонит persist() или save() и refreshEntity() звонит refresh(), то вы получаете правильное поведение, потому что refresh() перезаписываетлюбые изменения, сделанные в контексте постоянства со значениями из базы данных, и изменения, сделанные в контексте постоянства, не сохраняются в базе данных до сброса, поэтому база данных содержит старые значения при вызове refresh().

0 голосов
/ 22 декабря 2010

Таким образом, чтобы посмотреть дальше, нам нужно было установить режим сброса. Из поведения, которое мы увидели, мы считаем, что по умолчанию используется FlushMode.MANUAL, и нам нужно, чтобы оно было либо АВТОМАТИЧЕСКИМ, либо ВСЕГДА. У меня кружится голова, но сейчас я чувствую себя лучше: P

...