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

时间:2014-11-06 14:33:02

标签: java caching orm mybatis

我有2个映射器mapperA和mapperB。

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

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

问题是:

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

我的问题是:

如何在缓存两个结果时使关联正常工作。

注意:

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

1 个答案:

答案 0 :(得分:0)

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

mapperA中的

< mapper namespace="mapperA">

< cache/>

...

mapperB中的

< mapper namespace="mapperB">

< cache-ref namespace="mapperA"/>

...