【问题标题】:Spring + Hibernate few @Transactional classes are in one session?Spring + Hibernate 几个@Transactional 类在一个会话中?
【发布时间】: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


【解决方案1】:

在整个类上的@Transactional 注释在这里有点不幸(这并不是说一般来说这是一个坏主意,只是这样很难理解问题),把它放在方法上会更明显这里发生了什么 - 每个被调用的方法都在一个单独的事务中调用(除非一个实际上调用了第二个,但我的理解是它们是按顺序调用的)。

Hibernate 可能确定它不应该跨两个事务使用缓存。

【讨论】:

    【解决方案2】:

    我想我需要这样做

    类 OpenSessionInViewFilter

    http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate4/support/OpenSessionInViewFilter.html

    但是以前从未使用过它,但它应该允许保持会话整个请求

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 1970-01-01
      • 2016-11-16
      • 2011-07-25
      • 2012-10-15
      • 1970-01-01
      • 2017-12-22
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多