Spring ORM中HibernateTemplate无默认构造函数异常排查求助
异常信息
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateTemplate' defined in class path resource [config.xml]: Failed to instantiate [org.springframework.orm.hibernate5.HibernateTemplate]: No default constructor found
配置文件(config.xml)
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" name="ds"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/springorm"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <bean class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" name="factory"> <property name="dataSource" ref = "ds"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <property name="annotatedClasses"> <list> <value>com.spring.orm.entities.Student</value> </list> </property> </bean> <bean class="org.springframework.orm.hibernate5.HibernateTemplate" name="hibernateTemplate"> <property name="sessionFactory" ref="factory"/> </bean> <bean class="com.spring.orm.dao.StudentDaoImpl" name="studentDao"> <property name="hibernateTemplate" ref="hibernateTemplate"/> </bean>
依赖配置(pom.xml)
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>6.1.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.1.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>6.1.1</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.1.1.Final</version> <type>pom</type> </dependency> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> <version>6.1.1.Final</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
异常原因
1. Spring与Hibernate版本严重不兼容
你使用的Spring 6.1.1属于Spring 6.x系列,配置中使用的org.springframework.orm.hibernate5.HibernateTemplate是Spring专门为Hibernate 5.x设计的整合类,但你引入的Hibernate版本是6.1.1.Final。两个版本的API差异极大,导致Spring无法正确识别HibernateTemplate的构造函数,进而抛出“无默认构造函数”的错误。
2. 重复的Hibernate依赖引发冲突
pom.xml中同时引入了org.hibernate:hibernate-core(type为pom)和org.hibernate.orm:hibernate-core,前者是Hibernate 5.x及以前的groupId,后者是Hibernate 6.x开始使用的新groupId。这种重复引入会导致类路径中混入不同版本的Hibernate类,进一步干扰Spring的Bean实例化流程。
3. HibernateTemplate已过时
Spring 6.x中,HibernateTemplate已被官方标记为过时,官方推荐直接使用Hibernate原生API或Spring Data JPA来实现数据持久化,这也是版本适配问题的潜在诱因。
修复建议
- 清理重复依赖:删除
org.hibernate:hibernate-core的依赖条目,只保留org.hibernate.orm:hibernate-core:6.1.1.Final。 - 改用Hibernate 6对应的整合类:将配置文件中
HibernateTemplate的类路径改为org.springframework.orm.hibernate6.HibernateTemplate,同时将LocalSessionFactoryBean改为org.springframework.orm.hibernate6.LocalSessionFactoryBean,确保与Hibernate 6版本匹配。 - 降级版本(可选):如果不想使用新的整合类,可以将Spring版本降级到5.x系列(如5.3.x),搭配Hibernate 5.x版本,这样原有的
hibernate5包下的类可以正常工作。
内容的提问来源于stack exchange,提问作者Akshita Agarwal

