更新问题

时间:2012-12-05 23:19:27

标签: hibernate jpa

我正在尝试更新一个APPlication上的一些数据并将JMS事件发送到不同的JBOSS服务器。 侦听器将获取事件并尝试使用dblink的数据库视图读取数据。

最初,此视图没有该ID的数据。我使用其他应用程序更新数据,并在使用该ID发送JMS事件后发送。一旦侦听器收到此id,它将使用数据库视图获取数据。

我的问题是,在使用JPA / HIBERNATE阅读时,它仍然在读取空白的旧数据。

调用dao层的服务层使用以下transcation

    @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);

注意:唯一可行的方法是,在我收到事件后,如果我做了一个星际jdbc,我可以从该视图中获取数据,但是使用spring / hibernate配置它会变为空白。

有任何想法为什么它不能正常行为,为什么我需要在电话中做一个星际jdbc?

1 个答案:

答案 0 :(得分:0)

这看起来像是在提交发件人的事务之前收到邮件的标准方案。要使其工作,您需要在提交事务后发送消息。有了春天,你可以通过TransactionSynchornization

来做到这一点
TransactionSynchronizationManager.registerSynchronization(new  
         MessageQueueTransactionSynchronization(jmsSender, message));

其中MessageQueueTransactionSynchronization实施TransactionSynchronization并在使用afterCompletion(..)

触发status = TransactionSynchronization.STATUS_COMMITTED时发送消息