【发布时间】: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