【发布时间】:2015-11-11 19:51:10
【问题描述】:
我有几个类被注释为@Transactional
例如,我有第一类是 Spring Resolver
<annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="TestResolver" />
</mvc:argument-resolvers>
</annotation-driven>
类
@Transactional
public class TestResolver implements HandlerMethodArgumentResolver {
@SuppressWarnings("unchecked")
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
return testDao.load(Test.class, 1L)
}
}
我还有控制器类也注释了 @Transactional
@Controller
@Transactional
@RequestMapping(value = "go")
public class TestController {
@RequestMapping...
public Test get() {
return testDao.load(Test.class, 1);
}
}
问题是每次我访问 testDao.load(Test.class, 1) hibernate 向数据库发出查询并且不从控制器的缓存中提取 Test.class id = 1。
为什么不使用缓存?这两个调用在单个请求中发生,但似乎在不同的会话中。
如果我在控制器中这样做
testDao.load(Test.class, 1);
testDao.load(Test.class, 1);
第二次使用缓存,但不是在两个不同的组件执行它们的代码时..
【问题讨论】:
-
我只在我的服务中放了@Transactional注解。
-
Hibernate 不使用(二级)缓存,因为您没有配置缓存。
标签: java spring hibernate spring-mvc