多Oracle数据源配置异常:LocalSessionFactoryBean获取错误数据源
这种两个Oracle数据源混用LocalSessionFactoryBean和LocalContainerEntityManagerFactoryBean的场景,很容易踩配置关联的坑,我帮你梳理几个最可能的排查方向:
检查事务管理器与SessionFactory的绑定关系
你配置的<tx:annotation-driven transaction-manager="xxxTransactionManager" />里的事务管理器,是否和LocalSessionFactoryBean对应的数据源绑定?如果xxxTransactionManager是关联到LocalContainerEntityManagerFactoryBean的数据源,那调用SessionFactory时可能会被事务管理器的数据源覆盖。
解决方案:给LocalSessionFactoryBean单独配置对应的HibernateTransactionManager,并在使用该SessionFactory的业务方法上,通过@Transactional(value="xxxHibernateTxManager")指定对应的事务管理器。确保SessionFactory的注入精准性
获取SessionFactory时,有没有明确指定Bean的ID?比如用@Autowired注入时,必须搭配@Qualifier("你的LocalSessionFactoryBean的ID"),否则Spring可能会因为类型匹配错误(比如误注入EntityManagerFactory实例)导致拿到错误的数据源配置。也可以直接用@Resource(name="xxxSessionFactory")来精准指定要注入的Bean。核对数据源与SessionFactory的绑定配置
仔细检查LocalSessionFactoryBean的配置,确认它的dataSource属性是否指向了正确的Oracle数据源:<bean id="xxxSessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="正确的数据源ID"/> <!-- 其他Hibernate相关配置 --> </bean>别不小心把
ref写成另一个数据源的ID,这是很容易忽略的低级错误。排查Spring容器中Bean的重复或优先级问题
检查配置中是否重复定义了SessionFactory类型的Bean,或者某个Bean使用了@Primary注解导致Spring默认注入了另一个实例。如果存在这种情况,要么移除不必要的@Primary,要么在注入时通过@Qualifier明确指定目标Bean。
内容的提问来源于stack exchange,提问作者Lakshmi

