Слияние весной @Async методами не работает? - PullRequest
1 голос
/ 02 января 2012

При объединении сущностей JPA с использованием JpaTemplate в методах, помеченных @Async, сущность не получает идентификатор.Тем не менее, это работает при объединении всех в одном потоке.(но, к сожалению, слишком долго).

Например:

  ...

  @Autowired
  private JpaTemplate jpaTemplate;

  @Async
  public Future<Foo> asyncSave(final Foo foo) {
    return new AsyncResult<Foo>(save(foo));
  }

  @Override
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public Foo save(final Foo foo) {
    final Foo savedFoo = jpaTemplate.merge(foo); 
    return savedFoo; // <== savedFoo.getId() returns null !
  }

  ...

Вызов метода asyncSave () возвращает экземпляр Foo без идентификатора.На самом деле, я подозреваю, что возвращаемый объект находится в том же состоянии, что и до слияния.Я вижу много SQL, проходящих мимо на консоли.Вызов asyncSave () поступает из другого объекта репозитория.И это действительно отдельная тема.Итак, что еще это может быть?

У кого-нибудь когда-нибудь была такая же проблема?

Ответы [ 2 ]

0 голосов
/ 24 января 2013

@ Транзакционные аннотации создают прокси, который только перехватывает вызовы извне.Поэтому вы не открываете транзакцию для своего экземпляра Foo.

0 голосов
/ 24 марта 2012

Попробуйте добавить @Transactional для метода asyncSave.

...
@Async
@Transactional
public Future<Foo> asyncSave(final Foo foo) {
  return new AsyncResult<Foo>(save(foo));
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...