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