我的应用程序有一个单独的应用程序,提供给spring Ehcache.It工作正常。重要的是要知道缓存配置是服务方法,并且延迟加载对于从DB查询的所有对象都是如此。像这样:
@Transactional
@Override
@Caching(evict = { @CacheEvict(value = "schoolCache", key = "#school.id")})
public Integer save(School school) {
// Code here
}
很明显,Ehcache中保存的是懒惰的学校实例。在控制器层有ModelMapper在Model和ViewModel之间交换数据,如下所示:
@RequestMapping(value = "/load/{Id}", method = RequestMethod.GET)
@ResponseBody
public SchoolViewModel load(@PathVariable Integer Id) {
SchoolViewModel schoolViewModel = ModelMapper.map(schoolService.loadByEntityId(Id), SchoolViewModel.class);
return schoolViewModel;
}
如果SchoolViewModel具有进入学校的对象属性,则由ModelMapper从控制器的DB中获取。 所以我将应用程序集群并将Ehcache配置为Redis 问题是什么?在开始请求来自SchoolService的请求时,来自DB的这个服务查询以及因为hibernate的会话已经打开,ModelMapper成功地将Model映射到ViewModel。第二次调用id与id相同的服务方法时间从Redis获得学校对象并且没有Hiberante的会话,ModelMapper想要映射到学校的对象的属性得到异常。例外是这样的:
引起:org.hibernate.LazyInitializationException:不能 初始化代理 - 没有会话 org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165) 在 org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286) 在 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
那我该怎么办?帮助我的最好方法是什么? 非常感谢
答案 0 :(得分:1)
正如我在my book中解释的那样,您需要初始化服务方法中进一步需要的所有关联:
recognitionTask
所以,你有多种选择:
altbeacon.beacon.Beacon
或Hibernate.unproxy(proxy)
。schoolService.loadByEntityId(Id), SchoolViewModel.class)
。