@Async和@Transactional坚持持久存在对象JPA

时间:2017-05-11 16:44:41

标签: java spring jpa asynchronous transactions

我在@Async和@Transactional方法中的@Service类中执行一些持久操作。

在这个方法中,我们持久化了一些对象,然后我们在同一个事务中持久保存与这些已经持久化的对象相关的新对象。

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
    }

}

我猜是与事务和异步方法有关的东西,因为当没有异步注释时,相同的代码正在工作。

我还尝试在Transactional注释中使用传播,但是没有工作。

我在这里缺少什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

与级联存在关系问题,您需要使用@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)注释来声明实体中的关系。

答案 1 :(得分:0)

我找到了解决方案。

在这种情况下需要这种传播,因此传播了事务。

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

在这种情况下,如果不修改实体中的级联类型,则不会抛出异常。