当前位置: 首页 > 知识库问答 >
问题:

Spring冬眠,一个会话中有几个@Transactional类?

江永安
2023-03-14

我有几个类注释为@Transactional

例如,我有第一类,这是Spring旋转变压器

<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。控制器中的缓存中的类id=1。

为什么它不使用缓存?这两个调用在每个请求中发生,但似乎在不同的会话中。

如果我在控制器中这样做

testDao.load(Test.class, 1);
testDao.load(Test.class, 1);

第二次它使用缓存,但不是当两个不同的组件执行它们代码.

共有2个答案

闾丘坚诚
2023-03-14

我想我需要做

类OpenSessionInViewFilter

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

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

公羊晟
2023-03-14

整个类上的< code>@Transactional注释在这里有点不太合适(这并不是说这总体上是个坏主意,只是这样理解问题会更困难),将它放在方法上会使这里发生的事情变得更明显——每个被调用的方法都在一个单独的事务中被调用(除非一个方法实际上调用了第二个方法,但我的理解是它们是按顺序被调用的)。

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

 类似资料:
  • 我是Spring MVC和HiberNate的新手,我的会话配置有问题。我是通过使用Hibernate来做到这一点的。我现在想做的是将在DAO中自动装配会话工厂。 这是应用程序上下文。xml - 这是完整的堆栈跟踪。 这是刀的代码 购物车控制器

  • 在我的代码中,服务方法savePerson被注释为@Transactional。在这个方法中,Person实体被持久化,并且在中间故意抛出运行时异常。我支持不提交事务,但Person实体将保留在数据库中。。。。回滚不起作用,我不知道为什么。 这是我的Hibernate配置: 这是我的服务: 刀

  • 我有两个方法,它们都被注释为@Transactional。 我知道这两种方法将在两个不同的事务中执行。 但是这两个方法是在一个Hibernate会话中执行吗? spring事务管理器将会话保持到http请求结束。 我知道事务管理器可能会在它的 aop 代理中执行类似操作: 我只是找不到代码,如果我能在某处找到代码,我可以自己回答这个问题。

  • 将Hibernate空间升级到版本5.0.0.CR2后,以下声明不再起作用: 与一个: 如我所见,这个类不再存在于Jar文件中。几何类型发生了什么变化,它是如何被取代的?或者有另一个jar文件要包含吗? 编辑:澄清。我正在将Hibernate-Spatial与PostgreSQL-Postgis数据库结合使用。

  • 另一种方法是使用Crieteria关联,但关联只能与和一起工作! 请在这里帮帮我。

  • 我有两个实体,由单向连接OneTo很多: 当我试图用汽车创造我的司机时,像这样 ENVERS创建: 驱动程序表中包含新驱动程序数据的行,//例如,ID=1 包含新车数据的CAR表中的一行,//例如,ID=3 修订实体表中的一行,//例如,ID=8 驱动程序中的一行\u AUD: 一辆车有两排: 所以当我试图修改ID=1的驱动程序时 我得到了HibernateException,因为有两行具有相同的