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 在这里建议缺少连接池,看起来他是对的,但他没有发布解决方案。

所以我花了一些时间并最终完成它。 要解决这个问题,你应该做两件事:

  1. 将这些行添加到hibernate.cfg.xml文件中(可能您不需要全部):

     5 20 300 50 3000 
  2. 在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我和其他评论者“猜测”。

这是一个循序渐进的过程,可能对解决其他库中的其他奇怪问题也很有用。 结果这次真的很容易,发生了什么。

  1. 创建一个Maven项目(或使用现有项目),将Hibernate添加到依赖项(hibernate-entitymanager,我使用的是4.14版本)。 将其导入IDE,可自动附加源代码(我使用的是Intellij)
  2. 从Stack Trace中,找到抛出exception( UnknownUnwrapTypeException )的类( DriverManagerConnectionProviderImpl )并在那里导航(CTRL-N并键入类名),单击“Download sources”。
  3. 查找DriverManagerConnectionProviderImpl (ALT + F7)的用法
  4. 瞧! 事实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(); } 

代码大致表明:

  1. 如果设置了Environment.DATASOURCE (hibernate.connection.datasource),则使用DatasourceConnectionProviderImpl ;
  2. 如果存在c3p0,则实例化C3P0 Provider
  3. 检查了其他一些提供商(PROXOOL_PROVIDER_CLASS_NAME)
  4. 然后,如果存在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/