Spring整合Hibernate时AnnotationSessionFactoryBean实例化失败求助
搞定Spring+Hibernate启动时的AnnotationSessionFactoryBean实例化异常
Hey,我看了你遇到的问题——Spring 3.2 CR4搭配Hibernate 5.3.1启动时,死活实例不了AnnotationSessionFactoryBean,核心是找不到org.hibernate.cfg.AnnotationConfiguration类对吧?咱们一步步来梳理:
你提供的报错日志
主线程异常:org.springframework.beans.factory.BeanCreationException:创建类路径资源[resouce/springXML.xml]中定义的名称为'sf'的Bean失败;Bean实例化失败;嵌套异常为org.springframework.beans.BeanInstantiationException:无法实例化Bean类[org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]:构造函数抛出异常;嵌套异常为java.lang.NoClassDefFoundError:org/hibernate/cfg/AnnotationConfiguration 详细日志: 2020年1月19日 下午6:44:42 org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO:刷新org.springframework.context.support.ClassPathXmlApplicationContext@ad9418:启动时间[Sun Jan 19 18:44:42 IST 2020];上下文层次结构的根 2020年1月19日 下午6:44:42 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO:从类路径资源[resouce/springXML.xml]加载XML Bean定义 2020年1月19日 下午6:44:43 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO:在org.springframework.beans.factory.support.DefaultListableBeanFactory@18e2867中预实例化单例:定义的Bean为[bds,sf,ht,dao];工厂层次结构的根 2020年1月19日 下午6:44:43 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons INFO:销毁org.springframework.beans.factory.support.DefaultListableBeanFactory@18e2867中的单例:定义的Bean为[bds,sf,ht,dao];工厂层次结构的根 完整异常栈信息: Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in class path resource [resouce/springXML.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/cfg/AnnotationConfiguration at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:946) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:892) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:545) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:871) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at test.client.main(client.java:15) Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/cfg/AnnotationConfiguration at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:72) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:939) ... 13 more Caused by: java.lang.NoClassDefFoundError: org/hibernate/cfg/AnnotationConfiguration at org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean.<init>(AnnotationSessionFactoryBean.java:99) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126) ... 15 more Caused by: java.lang.ClassNotFoundException: org.hibernate.cfg.AnnotationConfiguration at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 21 more
你的Spring配置文件
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <bean id="bds" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> <property name="username" value="rayudu"/> <property name="password" value="oracle10g"/> <property name="maxActive" value="15"/> <property name="maxIdle" value="5"/> <property name="maxWait" value="5000"/> </bean> <bean id="sf" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="bds"/> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> <prop key="hibernate.hbm2ddl.auto">create</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <property name="annotatedClasses"> <list> <value>model.Student</value> </list> </property> </bean> <bean id="ht" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sf"/> </bean> <bean id="dao" class="dap.StudentDAOImp"> <property name="ht" ref="ht"/> </bean> </beans>
问题根源
说白了就是版本不兼容:
- 你用的
org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean是Spring为Hibernate 3.x专门做的整合类,它依赖Hibernate 3里的org.hibernate.cfg.AnnotationConfiguration类。 - 但你实际引入的是Hibernate 5.3.1,从Hibernate 4.x开始,
AnnotationConfiguration就被干掉了——注解功能直接合并到了org.hibernate.cfg.Configuration里,自然找不到这个类。
两种解决方案任你选
方案1:版本匹配(最简单,推荐)
既然用了Spring 3.2,那就乖乖搭配Hibernate 3.x版本(比如Hibernate 3.6.10.Final):
- 把项目里的Hibernate 5.x依赖全部换成3.x版本,记得要包含
hibernate-annotations.jar(Hibernate 3里注解功能单独在这个包)。 - 你的Spring配置完全不用改,直接启动就能跑。
方案2:升级Spring适配Hibernate 5(适合想保留新Hibernate版本的情况)
如果你不想换掉Hibernate 5,那得升级Spring到支持Hibernate 5的版本(至少Spring 4.2+,推荐4.3.x或5.x),同时修改配置:
- 升级Spring所有依赖到4.2及以上,确保引入
spring-orm模块。 - 把SessionFactory的Bean类换成Hibernate 5对应的整合类
org.springframework.orm.hibernate5.LocalSessionFactoryBean,配置逻辑差不多,但不需要专门的注解类了(Hibernate 5默认支持注解):
<bean id="sf" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="bds"/> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</prop> <!-- 可以根据你的Oracle版本调整 --> <prop key="hibernate.hbm2ddl.auto">create</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <property name="annotatedClasses"> <list> <value>model.Student</value> </list> </property> </bean>
- 对应的HibernateTemplate也要换成Hibernate 5版本的:
org.springframework.orm.hibernate5.HibernateTemplate。
额外注意点
- 别同时把Hibernate 3和5的Jar包放进项目,不然会出现依赖冲突,问题更麻烦。
- 用Maven/Gradle的话,一定要确保所有相关依赖的版本统一,避免出现隐性的版本不一致。
内容的提问来源于stack exchange,提问作者rayudu
相关产品推荐
相关产品推荐

