2012-01-02 76 views
1

在使用@Async標記的方法中使用JpaTemplate合併JPA實體時,實體不會獲得標識。但是,這在將所有內容合併到同一個線程中時都有效。 (但不幸的是,時間太長)。在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()」 返回一個Foo實例W/O型的ID。事實上,我懷疑返回的對象與合併之前處於相同的狀態。我在控制檯上看到大量的SQL傳遞。對asyncSave()的調用來自另一個存儲庫對象。它確實是一個單獨的線程。那麼,還有什麼呢?

有人曾經有過同樣的問題嗎?

回答

0

嘗試在方法asyncSave上添加@Transactional。

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

@Transactional註釋創建一個只攔截外部調用的代理。因此,您不會爲您的Foo實例打開一個事務。

相關問題