gpt4 book ai didi

spring - 什么决定了 hibernate session 在 @Transactional 之外是否可用

转载 作者:行者123 更新时间:2023-12-02 03:11:33 24 4
gpt4 key购买 nike

我的 Spring 应用程序始终使用 @org.springframework.transaction.annotation.Transactional 来打开事务。为了减少与事务相关的不必要的开销,我开始删除应用程序中不需要事务的区域中的一些注释。

这样做时,我注意到删除了 @Transactional 注释的 @Controller 类(在类级别或方法级别)仍然能够使用SessionFactory#getCurrentSession()。但是,当我从 @Service 中删除 @Transactional 注释时(具体来说,org.springframework.security.core.userdetails.UserDetailsS​​ervice 的实现) >) 并尝试调用 SessionFactory#getCurrentSession(),我收到以下信息:

Caused by: org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
at com.xxx.datasource.AbstractDAO.getSession(AbstractDAO.java:35)
at com.xxx.datasource.UserDAO.getLoginUser(UserDAO.java:209)
at com.xxx.datasource.UserDAO.getLoginUser(UserDAO.java:199)
at com.xxx.spring.userdetails.service.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:24)
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:102)
... 49 more

为什么会发生这种情况/什么决定 SessionFactory#getCurrentSession() 是否会返回 session 或引发异常?

(Spring 4.1.9 和 Hibernate 4.3.11)

最佳答案

未使用 @Transactional 注解的方法/类中的方法调用 SessionFactory.getCurrentSession() 将导致异常,如 TransactionSynchronizationManager.isSynchronizationActive() 将返回 false。它返回 false,因为 @Transaction 方面尚未执行,因此事务同步对于当前线程保持不活动状态。如果它被执行,它将为当前线程激活事务同步。查看方法: TransactionSynchronizationManager.initSynchronizationTransactionSynchronizationManager.isSynchronizationActive

正如您提到的,您的 @Controller 类工作正常,这可能是因为它们没有执行任何 dao 操作,或者 Controller 前面的层正在处理事务。

关于spring - 什么决定了 hibernate session 在 @Transactional 之外是否可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41539792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com