【问题标题】:Wildfly/Hibernate query result fails to return persisted entityWildfly/Hibernate 查询结果无法返回持久实体
【发布时间】:2019-12-24 23:00:30
【问题描述】:

在 Wildfly 16 中,我使用 EntityManager 持久化一个新实体并调用另一个例程来执行 HQL 查询以检索该实体,但它无法返回。

这是在服务器端运行,通常由客户端命令触发。该命令应该使新对象被持久化,然后调用在多个地方使用的例程来选择对象(例如并包括新持久化的对象)并格式化并将它们推送给订阅者。

我已经尝试了一些方法来使其正常工作:

  • 在 HQL 查询之前刷新 EntityManager
  • 通过调用的例程重用 EntityManager(有和没有刷新 post persist())

我设法获得所需结果的唯一方法是使初始客户端命令持久化实体,然后执行第二个客户端命令以检索通过第一个命令持久化的实体。这不是 HQL 在工作时检索数据的问题 - 它只是在持久化实体后无法立即工作。似乎数据在 HQL 查询之前没有持久化,或者 HQL 查询正在查看缓存的内容(尽管我没有专门设置类似的东西,所以它必须是我不知道的默认值) .

三个例程的一个例子:

//Routine A - calls B & C
routineB();
routineC();

//Routine B
EntityManager em = emProvider.getEntityManager(); //pulls em from a stateless bean tagged @PersistenceContext
Blah blah = new Blah();
em.persist(blah);
em.flush();

//Routine C
EntityManager em = emProvider.getEntityManager();
List<Blah> blahs = em.createNamedQuery("retrieveBlah").getResultList();
//do some stuff with blahs... except it's missing blah from Routine A

我的 persistence.xml 设置相关的 JIC

<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL94Dialect" />
<property name="hibernate.connection.useUnicode" value="true" />
<property name="hibernate.connection.characterEncoding" value="UTF-8" />
<property name="hibernate.connection.charSet" value="UTF-8" />
<property name="hibernate.id.new_generator_mappings" value="true" />

作为单个客户端命令的结果,我需要能够通过 HQL 查询持久化和检索持久化的数据。

【问题讨论】:

  • 您必须检查在您的应用程序环境中如何配置事务隔离。如果 emProvider.getEntityManager() 在新事务中创建新 EM,则在提交路由 A 打开的事务之前,您无法查询新实体。尝试在例程之外创建 EM 并作为参数传递给它们

标签: java hibernate jpa jakarta-ee wildfly


【解决方案1】:

事实证明,上面的帖子缺少解决问题的关键信息。发布此内容后,我继续测试并发现了我忽略的部分,“routineB()”被标记为@Asynchronous。所以它与routineC()并行执行。

【讨论】:

  • 感谢您回来发布您自己问题的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多