Hibernate 更新问题
我试图更新一个应用程序上的一些数据,并将JMS事件发送到不同的JBOSS服务器。 侦听器将获取事件,并尝试使用带有dblink的数据库视图读取数据 最初,此视图没有该ID的数据。我使用其他应用程序更新数据,安装后,JMS事件将与该ID一起发送。侦听器收到此ID后,它将使用数据库视图获取数据 我的问题是,当使用JPA/HIBERNATE进行读取时,它仍然在读取作为空白的旧数据 调用dao层的服务层正在使用以下转换Hibernate 更新问题,hibernate,jpa,Hibernate,Jpa,我试图更新一个应用程序上的一些数据,并将JMS事件发送到不同的JBOSS服务器。 侦听器将获取事件,并尝试使用带有dblink的数据库视图读取数据 最初,此视图没有该ID的数据。我使用其他应用程序更新数据,安装后,JMS事件将与该ID一起发送。侦听器收到此ID后,它将使用数据库视图获取数据 我的问题是,当使用JPA/HIBERNATE进行读取时,它仍然在读取作为空白的旧数据 调用dao层的服务层正在使用以下转换 @Transactional(readOnly = true, propag
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
The DAO Layer is using
@PersistenceContext
private EntityManager em;
Query query = em.createNativeQuery(sbQuery.toString());
我尝试了以下所有选项,但似乎没有效果
em.clear();
em.getEntityManagerFactory().getCache().evictAll();
em.flush();
query.setHint("javax.persistence.cache.storeMode", CacheStoreMode.BYPASS);
注意:它工作的唯一方式是,在我收到事件后,如果我使用StarightJDBC,我可以从该视图中获取数据,但是使用spring/hibernate配置,它的提交为空
有没有想过为什么它不能正常工作,为什么我需要对调用执行Starlight jdbc?这看起来像是一个标准场景,在提交发送方事务之前接收消息。要使其工作,您需要在事务提交后发送消息。使用spring,您可以通过TransactionSynchronization实现这一点:
其中MessageQueueTransactionSynchronization实现TransactionSynchronization并在完成后发送消息。。通过status=TransactionSynchronization触发。status\u COMMITTED是否配置了二级缓存?并摆脱不受支持的传播不,我没有任何第二级将尝试摆脱不受支持的配置谢谢你的答复。我做了两次测试,以确保只有在提交数据之后才收到事件。我测试的方法是,一旦我从监听器的onMessage方法接收到事件,我就用直接的JDBC查询,从视图中检索数据,而没有到服务层的Spring传输路径,它似乎正在工作。我唯一的解决方法就是使用StarightJDBC调用视图,然后离开它,然后调用服务层来获取视图中的实际数据。我仍然不明白为什么在调用服务层来从视图中获取数据之前,我需要调用直联jdbc来调用视图。如果我不直接使用jdbc调用视图,如果我直接使用Spring事务服务层,我可以看到数据确实是nulit的奇数。这是否发生在发送方和接收方的同一台计算机上?并检查您是否出于某种原因重用相同的hibernate会话/实体管理器Tanks Bozho,但运气不好,但我认为我没有使用相同的会话,真的怀疑hibernate JPA配置MessageQueueTransactionSynchronization是您实现spring事务同步的一个类
TransactionSynchronizationManager.registerSynchronization(new
MessageQueueTransactionSynchronization(jmsSender, message));