Spring+Hibernate项目Bean创建失败问题求助(NetBeans8.2、Spring3.2.7、Hibernate4.3.x环境)
嘿,我来帮你搞定这个问题!咱们先从最底层的错误信息入手——java.lang.NoClassDefFoundError: org/hibernate/cache/CacheProvider,这核心原因是你的Spring配置和代码用的是适配Hibernate 3的类,但实际引入的是Hibernate 4.3.x,两者不兼容。
Hibernate 4.x已经移除了CacheProvider这个接口,而你用的org.springframework.orm.hibernate3.LocalSessionFactoryBean和org.springframework.orm.hibernate3.HibernateTemplate都是Spring专门给Hibernate 3做的适配类,和Hibernate 4搭不上,所以才会出现找不到类的错误。
下面是具体的修复步骤:
1. 替换Spring配置里的Hibernate适配类
打开你的applicationContext.xml,把两个关键的bean类换成Hibernate 4版本的:
- 将
org.springframework.orm.hibernate3.LocalSessionFactoryBean改成org.springframework.orm.hibernate4.LocalSessionFactoryBean - 将
org.springframework.orm.hibernate3.HibernateTemplate改成org.springframework.orm.hibernate4.HibernateTemplate
修改后的完整配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/kampus"></property> <property name="username" value="root"></property> <property name="password" value=""></property> </bean> <bean id="mysessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="mappingResources"> <list> <value>Mahasiswa.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <bean id="template" class="org.springframework.orm.hibernate4.HibernateTemplate"> <property name="sessionFactory" ref="mysessionFactory"></property> </bean> <bean id="dao" class="dao.MahasiswaDao"> <property name="template" ref="template"></property> </bean> </beans>
2. 修改Dao类的导入包
打开MahasiswaDao.java,把HibernateTemplate的导入路径换成Hibernate 4的版本:
package dao; import entity.Mahasiswa; import org.springframework.orm.hibernate4.HibernateTemplate; // 这里替换成hibernate4的包 public class MahasiswaDao { HibernateTemplate template; public void setTemplate(HibernateTemplate template) { this.template = template; } public void saveMahasiswa(Mahasiswa m){ template.save(m); } }
3. 确认依赖包完整性
检查你的项目依赖,确保已经包含:
- Spring 3.2.7的
spring-orm包(这个包里包含了Hibernate 4的适配类) - Hibernate 4.3.x的核心包:
hibernate-core、hibernate-commons-annotations、hibernate-jpa-2.1-api等 - MySQL的JDBC驱动包(
mysql-connector-java)
如果用的是Maven或者Gradle,要确保这些依赖都正确引入;如果是手动加的jar包,检查有没有遗漏。
4. (可选)优化主类的Spring API使用
你的主类里用的XmlBeanFactory在Spring 3.2.x里已经过时了,建议换成更常用的ClassPathXmlApplicationContext,代码更规范:
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class test06 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); MahasiswaDao dao = (MahasiswaDao) context.getBean("dao"); Mahasiswa m = new Mahasiswa(); m.setNpm("1"); m.setNama("test"); m.setJurusan(""); m.setAlamat(""); dao.saveMahasiswa(m); } }
最后验证
完成所有修改后,重新编译运行项目,应该就能顺利创建Bean并执行数据库操作了。
内容的提问来源于stack exchange,提问作者Muhamad Rizki Nugroho

