我正在@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
}
}
我想这与事务和异步方法有关,因为当没有异步注释时,相同的代码正在工作。
我也尝试在事务注释中使用传播,但不起作用。
我在这里错过了什么?
谢谢!
联存在关系问题,您需要使用@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
注释,其中在实体中声明关系。
我找到了解决方案。
在这种情况下,此传播是必需的,因此将传播事务。
@Async
@Override
@Transactional(propagation = REQUIRES_NEW)
public void save(CampaignDTO campaignDTO) {
// saving related objects here throws an exception
}
在这种情况下,不会引发异常,而无需修改实体中的级联类型。