2012-01-02 3 views
1

@Async로 표시된 메소드에서 JpaTemplate을 사용하여 JPA 엔티티를 병합 할 때 엔티티는 ID를 얻지 못합니다. 그러나,이 모두 같은 스레드에서 병합 할 때 작동합니다. (그러나 길게 유감스럽게도). 예를 들어Spring @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()는"ID하여 w/o 푸 인스턴스를 반환한다. 사실, 나는 반환 된 객체가 병합 전과 동일한 상태에 있다고 생각합니다. 콘솔에서 SQL을 많이 보았습니다. asyncSave()에 대한 호출이 다른 리포지토리 개체에서 발생했습니다. 그리고 그것은 정말로 분리 된 실입니다. 그래서, 그 밖에 무엇이있을 수 있습니까?

누군가는 지금 같은 문제가 있었다?

답변

0

는 방법 asyncSave에 @Transactional를 추가하려고합니다.

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

@Transactional 주석은 외부로부터의 호출을 가로 채기 만하는 프록시를 만듭니다. 따라서 Foo 인스턴스에 대한 트랜잭션을 열지 않습니다.

관련 문제