Spring 5.3中已移除的HibernateDaoSupport.getSession()是否有替代方案?
Spring 5.3 替代 HibernateDaoSupport.getSession() 的可行方案
首先明确:Spring 5.x 版本的 org.springframework.orm.hibernate5.support.HibernateDaoSupport 确实移除了 getSession() 方法,你并没有遗漏相关内容。针对你的升级需求,有两种低侵入性的替代方案:
1. 自定义基础DAO类模拟旧逻辑
你可以封装一个自定义的基础DAO,复刻旧 getSession() 的会话管理行为,避免大规模修改现有代码:
- 注入
SessionFactory到自定义基础DAO中 - 实现
getSession()方法,结合 Spring 的TransactionSynchronizationManager跟踪会话,确保事务结束时自动释放未绑定的会话
示例代码:
public abstract class CustomHibernateDaoSupport { @Autowired private SessionFactory sessionFactory; protected Session getSession() { // 如果当前存在事务绑定的会话,直接返回 if (TransactionSynchronizationManager.hasResource(sessionFactory)) { return sessionFactory.getCurrentSession(); } // 打开新会话并绑定到当前线程 Session session = sessionFactory.openSession(); TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session)); return session; } // 统一释放会话(可结合AOP在方法执行完成后调用) protected void releaseSession(Session session) { SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory); if (sessionHolder != null && !sessionHolder.isSynchronizedWithTransaction()) { session.close(); } } }
让现有DAO继承这个自定义类,调用 getSession() 的方式和旧代码完全一致,同时通过AOP统一处理会话释放,避免每个方法手动调用。
2. 配置 Hibernate 适配 getCurrentSession()
无需自定义类,通过配置让 getSessionFactory().getCurrentSession() 实现类似旧方法的会话管理:
- 在 Hibernate 配置文件中设置:
hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext - 直接在DAO中调用
getSessionFactory().getCurrentSession(),此时 Spring 会自动管理会话的生命周期,无需手动关闭 - 注意:只读操作无需添加
@Transactional,涉及写操作的方法仍需添加事务注解,但可以通过类级别@Transactional减少重复标注
方案选择建议
- 若希望完全复刻旧代码逻辑、最小化改动,优先选择第一种自定义基础DAO的方案
- 若希望贴合 Spring 5.x 的设计规范、长期维护更简便,优先选择第二种配置适配方案
内容的提问来源于stack exchange,提问作者d00d
相关产品推荐
相关产品推荐

