Java配置下SessionFactory无法自动装配及Spring配置类未识别问题求助
我刚搞定了和你一模一样的问题——配置类被IDE标黄提示“此文件未配置应用上下文”,Hibernate死活不自动建表,还在注入SessionFactory的时候抛出NoSuchBeanDefinitionException。下面是详细的问题分析和解决步骤:
问题重现
你的DatabaseConfig配置类标黄,IDE提示“此文件未配置应用上下文”,同时出现两个核心问题:
- Hibernate无法根据实体类自动创建数据表
- 在
PersonDaoImpl中通过@Resource(name = "sessionFactory")注入SessionFactory时抛出如下错误:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personDaoImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.tornikeshelia.dao.PersonDaoImpl.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
你的配置类代码如下:
@Configuration @EnableTransactionManagement public class DatabaseConfig { @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); sessionFactory.setPackagesToScan("com.tornikeshelia.model"); sessionFactory.setHibernateProperties(getHibernateProperties()); return sessionFactory; } private Properties getHibernateProperties(){ Properties prop = new Properties(); Properties properties = new Properties(); properties.setProperty("hibernate.hbm2ddl.auto", "update"); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL57InnoDBDialect"); return properties; } @Bean(name = "dataSource") public BasicDataSource dataSource(){ BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); ds.setUrl("jdbc:mysql://localhost:3306/test?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=utf-8"); ds.setUsername("username"); //ds.setPassword(""); return ds; } @Bean @Autowired public HibernateTransactionManager transactionManager(SessionFactory sessionFactory){ HibernateTransactionManager txManager = new HibernateTransactionManager(); txManager.setSessionFactory(sessionFactory); return txManager; } @Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){ return new PersistenceExceptionTranslationPostProcessor(); } }
问题根源
这两个问题是关联的,核心原因有两点:
- 配置类所在的包位置不在Spring组件扫描的范围内,导致Spring无法发现这个配置类
- IDE未将该配置类关联到应用上下文,进一步导致Spring容器无法加载其中定义的Bean
解决步骤
按以下顺序操作即可彻底解决:
- 调整配置包位置:把
DatabaseConfig所在的包移动到com.tornikeshelia.model的父包(也就是com.tornikeshelia包)内,确保Spring的组件扫描能覆盖到这个配置类 - 配置应用上下文:
- 点击标黄的
DatabaseConfig类名,IDE会弹出黄色提示灯泡 - 点击灯泡,选择“配置应用上下文”选项
- 在弹出的新标签页中,选中
DatabaseConfig类并确认保存
- 点击标黄的
完成这两步后,Spring就能正确加载配置类,SessionFactory可以正常注入,Hibernate也能根据hibernate.hbm2ddl.auto=update的配置自动创建数据表了。
内容的提问来源于stack exchange,提问作者tornikeShelia

