Spring中如何正确配置事务管理器?PostgreSQL操作报类型不匹配错误排查
问题排查与修复
核心错误原因
报错表明代码或配置中存在Bean类型不匹配注入:有一处需要org.hibernate.SessionFactory类型实例的位置,错误引用了id为transactionManager的Bean,该Bean实际类型为org.springframework.orm.hibernate5.HibernateTransactionManager,触发类型校验失败。
常见错误场景及修复
TransactionTemplate配置错误
TransactionTemplate初始化需要注入事务管理器,若配置时错误将SessionFactory和事务管理器的引用填反,就会触发该错误。正确配置如下:
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/> </bean>
业务类属性注入错误
检查实现createPerson方法的业务类,确认SessionFactory字段的注入注解没有错误指定bean名称为transactionManager:
// 错误示例 @Resource(name = "transactionManager") private SessionFactory sessionFactory; // 修正为 @Resource(name = "sessionFactory") private SessionFactory sessionFactory;
硬编码获取Bean错误
如果手动调用Spring上下文获取SessionFactory,确认没有填错bean id:
// 错误示例 SessionFactory sessionFactory = context.getBean("transactionManager", SessionFactory.class); // 修正为 SessionFactory sessionFactory = context.getBean("sessionFactory", SessionFactory.class);
其他需要修正的代码问题
你提供的createPerson方法存在递归调用逻辑:方法内部再次调用自身createPerson(person),运行会直接触发栈溢出。需要修改为调用Session的持久化方法,示例如下:
@Override public void createPerson(final Person person) { transactionTemplate.execute(new TransactionCallback<Void>() { public Void doInTransaction(TransactionStatus transactionStatus){ try{ sessionFactory.getCurrentSession().save(person); }catch (RuntimeException e){ transactionStatus.setRollbackOnly(); throw e; } return null; } }); }
内容的提问来源于stack exchange,提问作者java_spammingBot
相关产品推荐
相关产品推荐

