Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧&x2B;Hibernate一个会话中有几个@Transactional类?_Java_Spring_Hibernate_Spring Mvc - Fatal编程技术网

Java 弹簧&x2B;Hibernate一个会话中有几个@Transactional类?

Java 弹簧&x2B;Hibernate一个会话中有几个@Transactional类?,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我有几个类被注释为@Transactional 例如,我有第一个类,它是Spring解析器 <annotation-driven> <mvc:argument-resolvers> <beans:bean class="TestResolver" /> </mvc:argument-resolvers> </annotation-driven> 我

我有几个类被注释为@Transactional

例如,我有第一个类,它是Spring解析器

<annotation-driven>            
        <mvc:argument-resolvers>
            <beans:bean class="TestResolver" />
        </mvc:argument-resolvers>
    </annotation-driven>
我还有一个控制器类注释了@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);
第二次它使用缓存,但不是两个不同的组件执行代码时。

我想我需要这样做

类OpenSessionInViewFilter


然而,以前从未使用过它,但它应该允许保留会话整个请求,即整个类上的
@Transactional
注释在这里有点不幸(这并不是说一般来说这是一个坏主意,只是这样很难理解问题),把它放在方法上会使这里发生的事情更加明显-每个被调用的方法都会在一个单独的事务中被调用(除非一个真正调用第二个,但我的理解是它们是按顺序调用的)


Hibernate可能决定不应在两个事务中使用缓存。

我只在服务中放置@Transactional注释。Hibernate不使用(第二级)缓存,因为您没有配置缓存。
testDao.load(Test.class, 1);
testDao.load(Test.class, 1);