当前位置: 首页 > 面试题库 >

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

闻慎之
2023-03-14
问题内容

我在其中查询数据库的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查询返回了以前的记录。我做错什么了吗?


问题答案:

我面临的问题是,在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;

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



 类似资料:
  • 主要内容:echarts_test_data.json 数据:,实例,实例,实例ECharts 通常数据设置在 setOption 中,如果我们需要异步加载数据,可以配合 jQuery等工具,在异步获取数据后通过 setOption 填入数据和配置项就行。 ECharts 通常数据设置在 setOption 中,如果我们需要异步加载数据,可以配合 jQuery等工具,在异步获取数据后通过 setOption 填入数据和配置项就行。 json 数据: echarts_test_

  • 我有一个PostgreSQL 8.4数据库,其中有一些表和视图,它们实际上是一些表上的联接。我使用NetBeans7.2(如本文所述)创建基于REST的服务,这些服务派生自这些视图和表,并将它们部署到Glassfish 3.1.2.2服务器上。 还有另一个进程,它异步更新用于构建视图的某些表中的内容。我可以直接查询视图和表,并看到这些更改已经正确发生。但是,当从基于REST的服务中提取时,这些值与

  • 和 和 我的存储库:

  • 问题内容: 我有一个带有某些表和视图的PostgreSQL 8.4数据库,这些表和视图本质上是对某些表的联接。我使用的NetBeans 7.2(如描述这里)来从这些观点和表导出并部署那些到Glassfish的3.1.2.2服务器基于REST的服务。 还有另一个过程可以异步更新用于构建视图的某些表中的内容。我可以直接查询视图和表,并查看这些更改已正确发生。但是,从基于REST的服务中提取时,这些值与

  • 问题内容: 我有一个用代码创建的(没有): 在另一堂课中,我有一个扩展方法来下载图像异步: 我在其他地方使用了此功能并正常工作,根据我的日志,我了解到下载的图像没有问题(渲染单元时),下载图像后,单元UI未更新。 我也尝试使用像Haneke这样的缓存库,但是问题存在并且没有改变。 请帮助我理解错误 谢谢 问题答案: 设置图像后,您应该致电 编辑:从改正为

  • 问题内容: 我有充分的理由相信函数rename()和unlink()都是异步的,根据我的理解,这意味着当调用函数时,它们下面的代码在文件系统上完成其过程之前会继续执行。对于互联网应用程序,这是一个问题,我将在下面解释,因为以后的代码取决于这些更改,这些更改已经确定。那么,有没有办法使两者同步,以便代码读取器在遇到这些功能时冻结,直到其所有任务在文件系统上完全执行为止? 这是delete-image