`

解决从spring上下午中读取的bean保存 No Hibernate Session bound to thread 错误

 
阅读更多

在项目架构中,主流框架都用了Spring的集大成者。在某些时候,我们需要从spring上下文中取得注册Bean,并操作CRUD。

我们通过实现ApplicationContextAware来获取上下文,取得想要的bean.

在保存时出现 No Hibernate Session bound to thread 错误。

需要在Service或者具体某个方法上加上@Transactional,开启了事务。

 

参考一下大侠的解释原因是:

getHibernateTemplate().getSessionFactory().getCurrentSession()的意思是得到当前线程 绑定的session,而当前线程绑定的session是通过当前的事务产生的,如果你没有配置事务的话,当前线程threadlocal中就不存在 session,这样就出现no session错误。 

而execute的回调方法,看源码HibernateTemplate中写道 
Java code
public Object execute(HibernateCallback action, boolean exposeNativeSession) throws DataAccessException {
        Assert.notNull(action, "Callback object must not be null");

        Session session = getSession();
        boolean existingTransaction = (!isAlwaysUseNewSession() &&
                (!isAllowCreate() || SessionFactoryUtils.isSessionTransactional(session, getSessionFactory())));

其中getSession,代码如下 
Java code
protected Session getSession() {
        if (isAlwaysUseNewSession()) {
            return SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor());
        }
        else if (isAllowCreate()) {
            return SessionFactoryUtils.getSession(
                    getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator());
        }
        else {
            try {
                return getSessionFactory().getCurrentSession();
            }
            catch (HibernateException ex) {
                throw new DataAccessResourceFailureException("Could not obtain current Hibernate Session", ex);
            }
        }
    }

其中默认private boolean alwaysUseNewSession = false,所以代码会走到else if (isAllowCreate())
注意这里:else if (isAllowCreate()),其中在HibernateTemplate类中默认private boolean allowCreate = true; 
意思说如果当前线程中的session不存在的话,是否允许创建,而默认是允许的,通过函数名字就很清楚,接下来是创建当前线程中的session的代码,所以在没有事务的状态下,用execute回调方法,就不会出现上述问题。
分享到:
评论

相关推荐

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    通过添加该注解,我们可以将 Hibernate Session 绑定到当前线程,从而解决 "No Hibernate Session bound to thread" 错误。 例如,在查询操作中,我们可以添加以下注解: @Transactional(propagation=Propagation....

    Hibernate-nosession

    本文将深入探讨Hibernate-nosession的概念、应用场景以及如何在实际代码中实现。 首先,理解什么是Hibernate Session。Session是Hibernate中的核心接口,它充当了应用程序和数据库之间的桥梁,负责对象的持久化操作...

    Hibernate Session释放模式

    在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...

    JAVA错误文档.pdf

    4. Hibernate框架错误:文档还包含了“org.hibernate.HibernateException: No Hibernate Session bound to thread”等错误信息,这是Hibernate框架常见的异常,表明在当前线程上没有绑定Hibernate Session。...

    OA系统整体设计及约定、搭建环境.rar_OA系统及配置_OA系统整体设计及约定、搭建环境_creation

    hibernate就会抛出: No Hibernate Session bound to thread, and configuration does not allow creation of one here}异常。 在实际的SSH web应用开发中,我们通常用spring来进行事务的管理。我们一般不会在dao层...

    spring分别与jdbc和hibernate结合的事务控制--案例

    在Spring中,我们可以使用HibernateTemplate或SessionFactoryBean来配置和管理Hibernate。同样,Spring的声明式事务管理也可以应用到Hibernate上,只需将@Transactional注解添加到使用Hibernate的方法上,Spring就会...

    使用Hibernate一些常见错误解决办法

    当遇到`no current session bound to current context`错误时,通常是因为事务管理方式不正确。Hibernate提供了多种会话上下文配置,如`thread`、`jta`等。在这种情况下,推荐使用`thread`配置,确保每个线程都有...

    SPring+structs2+hibernate框架搭建

    1. **Spring配置文件问题**:如果在配置Spring的`applicationContext.xml`文件时遇到错误“The prefix "context" for element "context:component-scan" is not bound”,需要在配置文件头部添加对应的命名空间声明...

    Spring+hibernate+quartz 定时操作数据库

    在spring+hibernate的框架中定时操作数据库,主要是拿到sessionFactory,不会出现no session 和transaction no-bound等问题,由sessionFactory完成对数据的操作,有些包是没有用的,有兴趣的可以自己删除掉

    关于springboot我出过的那些错误.docx

    Spring Boot 中的常见错误和解决方法 在使用 Spring Boot 框架进行开发时,经常会遇到各种错误和问题。这些错误可能是由于配置不正确、编码错误或其他原因引起的。在这里,我们将记录一些常见的 Spring Boot 错误和...

    引入mybatis-plus报 Invalid bound statement错误问题的解决方法

    "引入mybatis-plus报Invalid bound statement错误问题的解决方法" Mybatis-Plus是一个基于Mybatis的增强工具,旨在简化开发效率。然而,在使用Mybatis-Plus时,可能会遇到各种问题,例如Invalid bound statement...

    数据池连接Name jdbc is not bound in this Context解决方案

    总之,解决“Name jdbc is not bound in this Context”错误的关键在于正确配置数据源,并在Java代码中使用JNDI查找数据源以获取数据库连接。理解并熟练掌握这些步骤对于开发基于Java Web的应用程序来说至关重要。

    hibernate_reference使用指南全

    ### Hibernate使用指南精要 #### 一、简介与入门 **1.1 引言** Hibernate 是一个开源的对象关系...通过这些章节的学习,读者可以建立起坚实的基础,从而能够有效地利用 Hibernate 来解决实际开发中的数据访问问题。

    swoole#swoole-wiki#3.13.4 - 错误信息: XXXX client has already been b

    错误信息: XXXX client has already been bound to another coroutine使用协程客户端时出现以下错误信息:re

    PDO版本问题 Invalid parameter number: no parameters were bound

    然而,当遇到"Invalid parameter number: no parameters were bound"错误时,这意味着尝试执行的SQL语句中的占位符参数没有正确地与实际值绑定。 这个问题在某些旧版本的PHP和PDO中被报告为一个bug,特别是...

    Hibernate 3.x 参考手册

    ### Hibernate 3.x 参考手册关键知识点解析 #### 一、快速入门与Tomcat集成 **1.1 快速开始使用 Hibernate** - **环境准备:** - 使用 Hibernate 前需确保 Java 环境已安装配置。 - 下载 Hibernate 3.x 版本库...

    Hibernate Reference Documentation3.1

    1. Introduction to Hibernate 1.1. Preface 1.2. Part 1 - The first Hibernate Application 1.2.1. The first class 1.2.2. The mapping file 1.2.3. Hibernate configuration 1.2.4. Building with Ant 1.2.5. ...

    人工智能次协调逻辑推理系统

    例如,在知识图谱中,当发现数据矛盾时,该系统可以帮助修复错误,提高知识库的准确性和完整性。在智能对话系统中,它可以处理用户的模糊或矛盾输入,提供更合理的回答。 总之,次协调逻辑推理系统是人工智能领域的...

Global site tag (gtag.js) - Google Analytics