尝试通过RedisCacheManager访问Redis中剩余的分离对象时出现LazyInitializationException

时间:2014-10-23 15:10:35

标签: hibernate jpa spring-data-jpa spring-cache spring-data-redis

我使用Spring数据Redis来使用org.springframework.data.redis.cache.RedisCacheManager

在Redis中缓存序列化的JPA实体

以下是方法:

@Override
@Cacheable(value = MapCacheConfiguration.DATABASE_CACHE_NAME, key = "#root.method.name")
public Curriculum findCurriculumByMemberId(Long memberId) {
    return curriculumRepository.findCurriculumByMemberId(memberId);
}

不幸的是,重新启动我的启动应用程序后,实体仍然在Redis中缓存,我得到org.hibernate.LazyInitializationException

这可能是因为in this post所描述的原因,即通过hibernate访问分离的对象 - 在我的例子中是在缓存中留下的序列化对象。

有人可以建议处理这个问题的策略吗?

  1. 我应该在破坏我的应用程序时清理/清空缓存,记住重新填充缓存的过程非常昂贵,并且应用程序将托管在云(Heroku)中,其中dynos /容器被销毁和重新创建(因此很频繁地重新启动。
  2. 或者有没有办法重新连接到实体管理器的缓存实体?
  3. 有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

从未使用过Redis,但如果您的缓存应该在应用程序重新启动时保持不变,则可能需要在缓存实体之前获取所有需要的关系。另一个问题可能是那些缓存的实体是分离的,如果你想在事务中再次使用它们,这可能是一个问题。当然,您可以通过调用merge(entity)重新附加它们,另一方面,这可能会导致覆盖新数据的问题。

持久性缓存需要考虑的另一个问题是类版本,因为如果在重新部署之间更改类,如果缓存已经填充了以前类版本的实例,则反序列化将失败。