2017-05-11 151 views
0

我在@Async和@Transactional方法中,在我的@Service類中做了一些持久化操作。@Async和@Transactional堅持堅持已經存在的對象JPA

在這種方法中,我們堅持一些對象,然後我們在同一個事務中持久化與這些已經持久化的對象相關的新對象。因爲他認爲這個相關的對象不會被持久化

JPA拋出異常:

a new object was found through a relationship that was not marked cascade PERSIST 

這是我的服務類結構:

@Service 
public class AsyncOperationsServiceImpl implements AsyncOperationsService { 


    @Async 
    @Override 
    @Transactional 
    public void save(CampaignDTO campaignDTO) { 
     // saving related objects here throws an exception 
    } 

} 

我猜是交易和異步方法相關的東西,因爲當沒有Async註釋時,相同的代碼正在工作。

我也嘗試在事務註釋中使用傳播,但不工作。

我在這裏錯過了什麼?

謝謝!

回答

0

與級聯存在關係問題,您需要使用@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)註釋在實體中聲明關係。

+0

事實是,如果我在沒有異步的情況下執行相同的代碼工作正常,所以級聯不應該是必要的......此外,這些對象已經被保留。 – jpadilladev

0

我找到了一個解決方案。

這種傳播在這種情況下是必需的,所以事務被傳播。

@Async 
@Override 
@Transactional(propagation = REQUIRES_NEW) 
public void save(CampaignDTO campaignDTO) { 
    // saving related objects here throws an exception 
} 

在這種情況下不會引發異常,也不會修改實體中的級聯類型。