一尘不染

Jpa&Hibernate是否加载在DB中异步更改的数据?

hibernate

我在其中查询数据库的oracle视图。

create or replace view my_view as
Select cc.CCID ccid
       sm.SMCODE smcode,
       NVL(sm.smname, cc.ccname) sname
  From CC cc
 Inner Join SM sm
    On cc.id = sm.id;

我使用jpa 2.1hibernate 4.3.7将视图映射到我的实体。我的实体类如下所示:

public class CCRequest implements Serializable {

    private static final long serialVersionUID = 1L;

    private String ccId;

    private String smCode;

    private String sName;
}

我的映射XML看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 version="2.1">
    <entity class="CCRequest" name="CCRequest001">
        <table name="my_view"/>
        <attributes>
            <id name="ccId">
                <column name="ccid"/>
            </id>
            <basic name="smCode">
                <column name="smcode"/>
            </basic>
            <basic name="sName">
                <column name="sname"/>
            </basic>
        </attributes>
    </entity>
</entity-mappings>

所以我用jpa正确地查询了我的实体,它返回了我的所有记录。这是问题所在,当我异步更改数据库中的数据时,令人震惊的是,我的jpa查询返回了以前的记录。我做错什么了吗?


阅读 227

收藏
2020-06-20

共1个答案

一尘不染

我面临的问题是,在JpaTemplate使用jpa实体时,在4年前的spring,我毫无问题地从编程EntityManager实例传递到了JpaTemplate编程实例EntityManagerFactory

JpaTemplate本身会做任何事情来刷新EntityManager和清除缓存。当我迁移到Spring
4时,我遇到了JpaTemplate被删除的问题,因此我必须EntityManager直接使用它。

我从的实例以EntityManager编程方式获取实例EntityManagerFactory

我有一个从的实例EntityManagerProvider创建的实例的类。EntityManager``EntityManagerFactory

public class EntityManagerProvider {

    public static EntityManager createEntityManager(EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory.createEntityManager();
    }
}

我得到这样的entityManager实例:

<bean id="entityManager" class="com.tosan.novin.sipa.bo.da.jpa.EntityManagerFactoryProvider" factory-method="createEntityManager">
        <constructor-arg index="0" ref="entityManagerFactory"/>
</bean>

但是我知道,如果要EntityManager管理事务和刷新,唯一的方法是使用@PersistenceContext注入EntityManager到我的bean中。

@PersistenceContext
protected EntityManager em;

我对这种方式有些困惑,但是用这种方法解决了我的问题。

2020-06-20