Spring源码套件spring3 + Hibernate4 + maven 3 + MySQL 5
我在申请中收到错误但我不确定这意味着什么。 我发布了一些示例代码。 这是我得到的错误:
> SEVERE: Exception sending context initialized event to listener > instance of class > org.springframework.web.context.ContextLoaderListener > org.springframework.beans.factory.BeanCreationException: Error > creating bean with name 'transactionManager' defined in ServletContext > resource [/WEB-INF/spring/root-context.xml]: Invocation of init method > failed; nested exception is > org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to > requested type [javax.sql.DataSource] at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) > at > org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) > at > org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) > at > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) > at > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) > at > org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) > at > org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) > at > org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384) > at > org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) > at > org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) > at > org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779) > at > org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273) > at > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) > at > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566) > at > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556) > at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) > at java.util.concurrent.FutureTask.run(FutureTask.java:166) at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) > at java.lang.Thread.run(Thread.java:722) Caused by: > org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to > requested type [javax.sql.DataSource] at > org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.unwrap(DriverManagerConnectionProviderImpl.java:91) > at > org.springframework.orm.hibernate4.SessionFactoryUtils.getDataSource(SessionFactoryUtils.java:101) > at > org.springframework.orm.hibernate4.HibernateTransactionManager.afterPropertiesSet(HibernateTransactionManager.java:264) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) > ... 22 more > > ERROR: org.springframework.web.context.ContextLoader - Context > initialization failed > org.springframework.beans.factory.BeanCreationException: Error > creating bean with name 'transactionManager' defined in ServletContext > resource [/WEB-INF/spring/root-context.xml]: Invocation of init method > failed; nested exception is > org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to > requested type [javax.sql.DataSource] at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) > at > org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) > at > org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) > at > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) > at > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) > at > org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) > at > org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) > at > org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384) > at > org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) > at > org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) > at > org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779) > at > org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273) > at > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) > at > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566) > at > org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556) > at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) > at java.util.concurrent.FutureTask.run(FutureTask.java:166) at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) > at java.lang.Thread.run(Thread.java:722) Caused by: > org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to > requested type [javax.sql.DataSource] at > org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.unwrap(DriverManagerConnectionProviderImpl.java:91) > at > org.springframework.orm.hibernate4.SessionFactoryUtils.getDataSource(SessionFactoryUtils.java:101) > at > org.springframework.orm.hibernate4.HibernateTransactionManager.afterPropertiesSet(HibernateTransactionManager.java:264) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) > ... 22 more
这是我的pom文件:
4.0.0 com.reservosity component Reservosity war 1.0.0-BUILD-SNAPSHOT 1.6 3.1.0.RELEASE 1.6.9 1.5.10 org.springframework spring-context ${org.springframework-version} commons-logging commons-logging org.springframework spring-webmvc ${org.springframework-version} org.aspectj aspectjrt ${org.aspectj-version} org.slf4j slf4j-api ${org.slf4j-version} org.slf4j jcl-over-slf4j ${org.slf4j-version} runtime org.slf4j slf4j-log4j12 ${org.slf4j-version} runtime log4j log4j 1.2.15 javax.mail mail javax.jms jms com.sun.jdmk jmxtools com.sun.jmx jmxri runtime javax.inject javax.inject 1 javax.servlet servlet-api 2.5 provided javax.servlet.jsp jsp-api 2.1 provided javax.servlet jstl 1.2 org.hibernate hibernate-core 4.1.3.Final org.hibernate hibernate-entitymanager 4.1.1.Final org.springframework spring-orm 3.1.1.RELEASE cglib cglib 2.2.2 runtime org.hibernate.common hibernate-commons-annotations 4.0.1.Final mysql mysql-connector-java 5.1.20 org.javassist javassist 3.15.0-GA org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final junit junit 4.7 test maven-eclipse-plugin 2.9 org.springframework.ide.eclipse.core.springnature org.springframework.ide.eclipse.core.springbuilder true true org.apache.maven.plugins maven-compiler-plugin 2.3.2 1.6 1.6 -Xlint:all true true org.codehaus.mojo exec-maven-plugin 1.2.1 org.test.int1.Main
服务环境:
root-context.xml:
classpath:hibernate.cfg.xml
hibernate.cfg.xml:
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/****** *** *** 10 true org.hibernate.dialect.MySQLDialect thread
如果我删除bean transactionManager,它工作正常,但是当我再次添加它时,我得到那个看起来很脏的错误。 不知道为什么。
我是spring的新手,可以帮助我!
谢谢
安德鲁
我的问题完全一样。 KyelJmD 在这里建议缺少连接池,看起来他是对的,但他没有发布解决方案。
所以我花了一些时间并最终完成它。 要解决这个问题,你应该做两件事:
-
将这些行添加到hibernate.cfg.xml文件中(可能您不需要全部):
5 20 300 50 3000 -
在pom.xml中添加此依赖项:
org.hibernate hibernate-c3p0 4.1.9.Final org.hibernate hibernate-ehcache 4.1.9.Final
没有maven依赖,Hibernate只是默默地忽略了C3P0配置。
使用上面的配置我不会再得到UnknownUnwrapTypeExceptionexception,它现在似乎工作正常。
我的设置:Spring 3.2.1,Hibernate 4.1.9,Tomcat 7.0.35。
Dislaimer:如本问题所述,您不应该使用hibernate.cfg.xml文件。 请改用dataSource
bean,因为,例如,您可以稍后将其用于JdbcTemplate。
编辑:
我回答了这个问题,已经有一段时间了。 这似乎是正确的,但我从不喜欢它,因为它是一种猜测,我们应该真正避免。
所以,因为我发现了这个有趣的内容而我无法在Hibernate 4.1文档中找到任何内容,所以我试图certificate我和其他评论者“猜测”。
这是一个循序渐进的过程,可能对解决其他库中的其他奇怪问题也很有用。 结果这次真的很容易,发生了什么。
- 创建一个Maven项目(或使用现有项目),将Hibernate添加到依赖项(hibernate-entitymanager,我使用的是4.14版本)。 将其导入IDE,可自动附加源代码(我使用的是Intellij)
- 从Stack Trace中,找到抛出exception(
UnknownUnwrapTypeException
)的类(DriverManagerConnectionProviderImpl
)并在那里导航(CTRL-N并键入类名),单击“Download sources”。 - 查找
DriverManagerConnectionProviderImpl
(ALT + F7)的用法 - 瞧! 事实certificate,
DriverManagerConnectionProviderImpl
只有一种用法 – 它是ConnectionProviderInitiator
一个initiateService(...)
方法,它或多或少地尝试了几个ConnectionProvider
实现,然后它回DriverManagerConnectionProviderImpl
,在我们的例子中它不起作用,抛出UnknownUnwrapTypeException
。
来自Hibernate的ConnectionProviderInitiator.java:
ConnectionProvider connectionProvider = null; String providerClassName = getConfiguredConnectionProviderName( configurationValues ); if ( providerClassName != null ) { connectionProvider = instantiateExplicitConnectionProvider( providerClassName, classLoaderService ); } else if ( configurationValues.get( Environment.DATASOURCE ) != null ) { connectionProvider = new DatasourceConnectionProviderImpl(); } if ( connectionProvider == null ) { if ( c3p0ConfigDefined( configurationValues ) && c3p0ProviderPresent( classLoaderService ) ) { connectionProvider = instantiateExplicitConnectionProvider( C3P0_PROVIDER_CLASS_NAME, classLoaderService ); } } if ( connectionProvider == null ) { if ( proxoolConfigDefined( configurationValues ) && proxoolProviderPresent( classLoaderService ) ) { connectionProvider = instantiateExplicitConnectionProvider( PROXOOL_PROVIDER_CLASS_NAME, classLoaderService ); } } if ( connectionProvider == null ) { if ( configurationValues.get( Environment.URL ) != null ) { connectionProvider = new DriverManagerConnectionProviderImpl(); } } if ( connectionProvider == null ) { LOG.noAppropriateConnectionProvider(); connectionProvider = new UserSuppliedConnectionProviderImpl(); }
代码大致表明:
- 如果设置了
Environment.DATASOURCE
(hibernate.connection.datasource),则使用DatasourceConnectionProviderImpl
; - 如果存在c3p0,则实例化C3P0 Provider
- 检查了其他一些提供商(PROXOOL_PROVIDER_CLASS_NAME)
- 然后,如果存在
Environment.URL
(hibernate.connection.url),我们使用DriverManagerConnectionProviderImpl
。
就是这样。 这解释了为什么如果我们将C3P0添加为Maven依赖关系或定义DataSource(正如Michael ako Tecourt在下面的评论中所说)解决了这个问题。
另一个问题是为什么DriverManagerConnectionProviderImpl抛出UnknownUnwrapTypeException – 它是否是一个bug – 无论如何,我没有看到Hibernate 4.2.0甚至4.3.0.Beta中的代码有任何变化。
只是看看它来自这个代码的问题:
if ( ConnectionProvider.class.equals( unwrapType ) || DriverManagerConnectionProviderImpl.class.isAssignableFrom( unwrapType ) ) { return (T) this; } else { throw new UnknownUnwrapTypeException( unwrapType ); }
其中unwrapType是javax.sql.DataSource
。
虽然我无法准确解释导致这种情况的配置是什么,但我可以建议修复。
在spring应用程序上下文中定义DriverManagerDataSource
bean,然后将其作为属性提供给LocalSessionFactoryBean
。 确保从Hibernate配置文件中删除数据源配置。
尝试将spring和hibernate库包含到lib文件夹中。 我希望这些有所帮助。
本文建议您在hibernate配置文件中没有定义数据源。
本文详细介绍了Spring 3.1和Hibernate 4.1的集成:
http://blog.springsource.org/2012/04/06/migrating-to-spring-3-1-and-hibernate-4-1/
- org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:*靠近第1行
- 添加到集合时不会触发PreUpdate
- 使用Hibernate时内存使用率很高
- org.hibernate.HibernateException:无法解析配置:hibernate.cfg.xml
- 为什么不建议使用HibernateTemplate?
- 为什么hibernate强制在session.get方法中进行序列化
- Hibernate – 它改变了数据库的结构吗?
- 为具有生成ID的实体实现equals()时的最佳做法是什么
- 为什么@OneToMany在Hibernate中不能inheritance