java - 在调用查询此持久化实体的另一个线程之前,如何确保实体已持久化?

标签 java multithreading persistence entitymanager spring-transactions

我的 Java Web 应用程序(Spring + JPA)中出现以下情况:

  1. 我有将实体保存到数据库的方法
  2. 在持久化实体之后,我立即调用 notify() 来唤醒另一个线程。
  3. 第二个线程正在处理我刚刚保留的实体。

所以结果我有: 第二个线程查询一个新的持久实体,但它还不存在。因此,第二个线程向数据库发送查询的速度比主线程持久化它的速度更快。如果我添加一些超时,它就可以完美工作。但这对我来说不是一个合适的解决方案。我想我可以使用 contains() 方法检查实体管理器。但我不确定它的效率如何。 我对这个主题还很陌生,所以我很高兴听到您的建议。

附:我使用的是Spring框架,因此持久化和通知发生在一个事务中(用@Transactional注释标记)。第二个线程没有任何 @Transactional 类。

谢谢, 艾米丽。

最佳答案

尝试使用实体监听器在实体被持久化时收到通知。您可以在 JPA Wiki Book 中阅读有关实体监听器的信息。 ,Hibernate documentation并在 www.objectdb.com .

关于java - 在调用查询此持久化实体的另一个线程之前,如何确保实体已持久化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18176358/

相关文章:

java - Hibernate - 如何通过 Hibernate 将 java.net.URL 存储到数据库中

java - 实现必须从不同线程添加/删除元素的元素列表的最佳方法是什么?

java - 使用 entityManager.persist(Object) 插入 ... 值;

java - 捕获异常和错误

java - 使用给定的字段对象 id 而不是对象本身存储 JPA 实体

c++ - 在运行之间保存 RocksDB 存储的值

java - 如何在 Maven 模块之间共享 protobuf 文件?

java - ServerEndpoint 和 web.xml

java - 计算一系列值的斜率

multithreading - GPGPU 与多核?