当前位置: 首页 > 知识库问答 >
问题:

@Async和@Transactional坚持保留已持久化的对象 JPA

邹高峻
2023-03-14

我正在@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
    }

}

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

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

我在这里错过了什么?

谢谢!

共有2个答案

曾昂然
2023-03-14

我找到了解决办法。

在这种情况下,这种传播是必需的,因此事务被传播。

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

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

岳高明
2023-03-14

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

 类似资料:
  • 在传统的Web开发中,PHP创建的对象、数据、资源等会在请求完毕后全部释放,导致很难做到持久化。而在WorkerMan中可以轻松做到这些。 在WorkerMan中如果想在内存中永久保存某些数据资源,可以将资源放到全局变量中或者类的静态成员中。 例如下面的代码: 用一个全局变量$connection_count保存一个当前进程的客户端连接数。 <?php use WorkermanWorker; r

  • Hibernate 认为持久化类(persistent class)新实例化的对象是瞬时(Transient)的。我们可通过将瞬时(Transient)对象与 session 关联而把它变为持久的(Persistent)。 DomesticCat fritz = new DomesticCat(); fritz.setColor(Color.GINGER); fritz.setSex('M');

  • 问题内容: 我试图在spring启动时将JSON对象存储在MySQL数据库中。我知道我做错了事,但是我无法弄清楚到底是什么原因,因为我对Spring还很陌生。 我有一个休息端点,在这里我通过HTTP PUT获取以下JSON对象,并且需要将其存储在数据库中,以便用户以后可以通过HTTP GET获取它。 请注意,在上述情况下,对象 中* 键 的 数量 可能会有所不同,由于该要求,我正在使用a 来捕获控

  • 1. 前言 本节课和大家聊聊持久化对象的 3 种状态。通过本节课程,你将了解到: 持久化对象的 3 种状态; 什么是对象持久化能力。 2. 持久化对象的状态 程序运行期间的数据都是存储在内存中。内存具有临时性。程序结束、计算机挂机…… 内存中的数据将不复存在。 重要的数据,需要使用持久化技术将数据保存到永久性设备上。Hibernate 能够通过 PO(持久化对象) 将数据持久化到数据库。 Hibe

  • 创建新的Shelf # shelve_create.py import shelve with shelve.open('test_shelf.db') as s: s['key1'] = { 'int': 10, 'float': 9.5, 'string': 'Sample data', } # shelve_existing

  • 我有一个简单的JPA存储库,看起来如下所示: 和两个有一个单子映射的类,如下所示: . 现在,我知道我可以很容易地编辑和持久化一个像这样的用户实例: 但是,在没有指向实例的指针的上下文中,如何持久化实例,f.I.: 我可以只调用吗? 我是否需要自动连接另一个存储库()并在其上调用.save()?