【问题标题】:@Async and @Transactional insists in persist already persisted objects JPA@Async 和 @Transactional 坚持持久化已持久化的对象 JPA
【发布时间】:2017-10-10 19:18:29
【问题描述】:

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

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

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
    }

}

我猜这与 Transactions 和 Async 方法有关,因为当没有 Async 注释时,相同的代码正在工作。

我也尝试在 Transactional 注释中使用传播,但不起作用。

我在这里错过了什么?

谢谢!

【问题讨论】:

    标签: java spring jpa asynchronous transactions


    【解决方案1】:

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

    【讨论】:

    • 事实是,如果我在没有异步的情况下执行相同的代码就可以了,所以级联应该是没有必要的......而且,这个对象已经被持久化了。
    【解决方案2】:

    我找到了解决办法。

    这种情况下需要这种传播,所以传播交易。

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2017-02-17
      • 1970-01-01
      • 2017-04-09
      • 2013-04-12
      相关资源
      最近更新 更多