我在其中查询数据库的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.1和hibernate 4.3.7将视图映射到我的实体。我的实体类如下所示:
jpa 2.1
hibernate 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查询返回了以前的记录。我做错什么了吗?
我面临的问题是,在JpaTemplate使用jpa实体时,在4年前的spring,我毫无问题地从编程EntityManager实例传递到了JpaTemplate编程实例EntityManagerFactory。
JpaTemplate
EntityManager
EntityManagerFactory
JpaTemplate本身会做任何事情来刷新EntityManager和清除缓存。当我迁移到Spring 4时,我遇到了JpaTemplate被删除的问题,因此我必须EntityManager直接使用它。
我从的实例以EntityManager编程方式获取实例EntityManagerFactory。
我有一个从的实例EntityManagerProvider创建的实例的类。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
@PersistenceContext protected EntityManager em;
我对这种方式有些困惑,但是用这种方法解决了我的问题。