1.事务需要由spring管理
<prop key="hibernate.current_session_context_class">
org.springframework.orm.hibernate5.SpringSessionContext
</prop>
2.在业务service注入sessionFactory
@Resource(name="sessionFactory")
private SessionFactory sessionFactory;
3.service方法添加事务注解
单个线程{
//绑定session到当前线程
boolean participate = serviceImpl.bindHibernateSessionToThread(sessionFactory);
//业务逻辑...
//关闭session
serviceImpl.closeHibernateSessionFromThread(participate, sessionFactory);
}
// 绑定Session到新的线程方法
public static boolean bindHibernateSessionToThread(SessionFactory sessionFactory) {
if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
// Do not modify the Session: just set the participate flag.
return true;
} else {
Session session = sessionFactory.openSession();
session.setFlushMode(FlushMode.MANUAL);
SessionHolder sessionHolder = new SessionHolder(session);
TransactionSynchronizationManager.bindResource(sessionFactory, sessionHolder);
}
return false;
}
// 关闭Session方法
public static void closeHibernateSessionFromThread(boolean participate, Object sessionFactory) {
if (!participate) {
SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager
.unbindResource(sessionFactory);
SessionFactoryUtils.closeSession(sessionHolder.getSession());
}
}
spring4+hHibernate5 项目使用多线程时单个线程无法获取session问题
原文:https://www.cnblogs.com/guojunjieblog/p/14741573.html