springboot(Spring5) + hibernate

  • 1、Spring5的坑:Could not obtain transaction-synchronized Session for current thread
  • 2、spring boot + jpa报错:No CurrentSessionContext configured

https://blog.csdn.net/RL_LEEE/article/details/84321282
https://blog.csdn.net/qq_37769323/article/details/104054581

错误提示很直白了,就是当前没有事务的session,所以报错, 将代码做以下调整,可以解决:

Session session = null;
try {
	    session = currentSession();
	} catch (HibernateException he) {
		//当前没有事务不做任何处理
	}

Spring3在没有当前事务的情况下不会报错,Spring5却出现了错误?追踪下源码,发现两者的区别。

logger.debug("Opening Hibernate Session");
Session session = (entityInterceptor != null ?
sessionFactory.openSession(entityInterceptor) : sessionFactory.openSession());
在没有获取到当前事务的session时创建一个session,所以不管当前有没有做事务(注解或显示创建),getSession()都不会报错。

再看Spring5,从HibernateDaoSupport开始跟踪currentSession()的实现,如果你的SessionFactory配置的是LocalSessionFactoryBean的工厂模式的话,会在org.hibernate.internal.SessionFactoryImpl找到CurrentSession的实现

	public Session getCurrentSession() throws HibernateException {
		if ( currentSessionContext == null ) {
			throw new HibernateException( "No CurrentSessionContext configured!" );
		}
		return currentSessionContext.currentSession();
	}
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
上一篇:05-Spring5 事务管理


下一篇:10-Spring5 基于注解方式创建bean实例