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

时间:2013-08-11 20:28:45

标签: java multithreading persistence entitymanager spring-transactions

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

  1. 我有将实体持久保存到数据库的方法
  2. 在持久化实体之后,我打电话给notify(),它正在唤醒另一个线程。
  3. 第二个主题正在与我刚刚持有的实体合作。
  4. 因此,我有: 第二个线程查询新持久化的实体,但它还没有。所以第二个线程更快地向数据库发送查询,然后主线程持续存在。如果我添加一些超时它完美的工作。但对我来说这不是一个合适的解决方案。我想我可以用contains()方法检查entitymanager。但我不确定它会有多高效。 我对这个问题很新,所以我很高兴听到你的意见。

    P.S。我正在使用Spring框架,因此在一个事务中持久化并通知发生事件(标记为@Transactional注释)。第二个帖子没有任何@Transactional类。

    谢谢, 艾米丽。

2 个答案:

答案 0 :(得分:0)

尝试使用Entity Listeners在实体持久化时收到通知。您可以在JPA Wiki BookHibernate documentationwww.objectdb.com中阅读有关实体监听器的信息。

答案 1 :(得分:0)

只有在事务提交后才会真正持久存在于数据库中,就像在@Transactional方法中发生的那样。所以我需要在事务提交后调用第二个线程,并且我能够使用TransactionSynchronizationManager及其afterCommit()方法来完成它。以下是包含所有信息和示例http://azagorneanu.blogspot.ru/2013/06/transaction-synchronization-callbacks.html的链接 也许它会对某人有用。