MyBatis-缓存刷新后不会更新嵌套结果

Vla*_*ejs 5 java orm caching mybatis

我有2个映射器mapperA和mapperB。

mapperA的结果映射A仅包含结果元素(简单属性),并缓存在自己的名称空间中。

mapperB具有结果映射B,该结果映射B包含与A的关联(选择语句findById),并且也缓存在自己的名称空间中。

问题是:

  • mapperB.findById (加载B和关联的A-都被缓存)
  • mapperA.findById (没有选择执行的A被缓存)
  • mapperA.update (更新一些A-刷新缓存A)
  • mapperA.findById (已执行选择-已加载的A已更新)
  • mapperB.findById-这是问题-不执行选择,因为B被缓存。但是它与A实例一起缓存。该实例不反映更新。应该执行选择/缓存查找以加载当前的A实例。

我的问题是:

当两个结果都被缓存时,如何使关联正常工作。

笔记:

我知道我可以强制A和B映射器使用单个缓存名称空间,因此当A更新时,它将刷新所有缓存的A和B查询。但是请考虑我有10个实例-这些实例每隔几分钟就会更新一次。还有100万个B实例-这些实例每天更新一次。每次更新A时刷新所有B都是没有效率的。

小智 0

您应该使用相同命名空间缓存。

在映射器A中:

< mapper namespace="mapperA">

< cache/>
Run Code Online (Sandbox Code Playgroud)

...

在映射器B中:

< mapper namespace="mapperB">

< cache-ref namespace="mapperA"/>

...
Run Code Online (Sandbox Code Playgroud)