2017-05-11 153 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 
} 

在这种情况下不会引发异常,也不会修改实体中的级联类型。