编程语言
首页 > 编程语言> > java-Jpa&Hibernate是否加载在DB中异步更改的数据?

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

作者:互联网

我在其中查询数据库的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将视图映射到我的实体.
我的实体类如下所示:

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查询返回了以前的记录.
我做错什么了吗?

解决方法:

Hibernate缓存了以前的结果,因此您应该使用entityManager.clear()来清理关联的缓存.它将强制再次执行查询.相关线程以获取更多详细信息:

> When to Use EntityManager.clear()?
> Am I supposed to call EntityManager.clear() often to avoid memory leaks?
> Hibernate does not refresh entity childs completely

有关Hibernate缓存的更多信息:

> What are First and Second Level caching in Hibernate?
> How to disable hibernate caching

另一种选择是使用entityManager.refresh(obj)将数据库数据与会话数据同步.

标签:java,spring,jpa,hibernate,sql-view
来源: https://codeday.me/bug/20191011/1890533.html