Spring源码套件spring3 + Hibernate4 + maven 3 + MySQL 5 [英] Spring source suite spring3 + Hibernate4 + maven 3 + MySQL 5

查看:270
本文介绍了Spring源码套件spring3 + Hibernate4 + maven 3 + MySQL 5的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序出现错误,但我不确定它的含义。我发布了一些示例代码。这是我得到的错误:

 > SEVERE:将上下文初始化事件发送给侦听器的例外
>类
>的实例org.springframework.web.context.ContextLoaderListener
> org.springframework.beans.factory.BeanCreationException:错误
>在ServletContext中定义名为'transactionManager'的bean
>资源[/WEB-INF/spring/root-context.xml]:调用init方法
>失败;嵌套异常是
> org.hibernate.service.UnknownUnwrapTypeException:无法解开为
>请求类型[javax.sql.DataSource] at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
>在
> org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:294)
>在
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
>在
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
>在
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
>在
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
>在
> org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
>在
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
>在
> org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
>在
> org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
>在
> org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
>在
> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)
>在
> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
>在
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>在
> org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1566)
>在
> org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1556)
>在java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:334)
>在java.util.concurrent.FutureTask.run(FutureTask.java:166)at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
>在
> java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:603)
>在java.lang.Thread.run(Thread.java:722)引起:
> org.hibernate.service.UnknownUnwrapTypeException:无法解开为
>请求类型[javax.sql.DataSource] at
> org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.unwrap(DriverManagerConnectionProviderImpl.java:91)
>在
> org.springframework.orm.hibernate4.SessionFactoryUtils.getDataSource(SessionFactoryUtils.java:101)
>在
> org.springframework.orm.hibernate4.HibernateTransactionManager.afterPropertiesSet(HibernateTransactionManager.java:264)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
> ... 22更多
>
>错误:org.springframework.web.context.ContextLoader - 上下文
>初始化失败
> org.springframework.beans.factory.BeanCreationException:错误
>在ServletContext中定义名为'transactionManager'的bean
>资源[/WEB-INF/spring/root-context.xml]:调用init方法
>失败;嵌套异常是
> org.hibernate.service.UnknownUnwrapTypeException:无法解开为
>请求类型[javax.sql.DataSource] at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
>在
> org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:294)
>在
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
>在
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
>在
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
>在
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
>在
> org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
>在
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
>在
> org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
>在
> org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
>在
> org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
>在
> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)
>在
> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
>在
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>在
> org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1566)
>在
> org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1556)
>在java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:334)
>在java.util.concurrent.FutureTask.run(FutureTask.java:166)at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
>在
> java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:603)
>在java.lang.Thread.run(Thread.java:722)引起:
> org.hibernate.service.UnknownUnwrapTypeException:无法解开为
>请求类型[javax.sql.DataSource] at
> org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.unwrap(DriverManagerConnectionProviderImpl.java:91)
>在
> org.springframework.orm.hibernate4.SessionFactoryUtils.getDataSource(SessionFactoryUtils.java:101)
>在
> org.springframework.orm.hibernate4.HibernateTransactionManager.afterPropertiesSet(HibernateTransactionManager.java:264)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
> ... 22 more

这是我的pom文件:

 < modelVersion> 4.0.0< / modelVersion> 
< groupId> com.reservosity< / groupId>
< artifactId>组件< / artifactId>
< name> Reservosity< / name>
<包装>战争< / packaging>
< version> 1.0.0-BUILD-SNAPSHOT< / version>
<属性>
< java-version> 1.6< / java-version>
< org.springframework-version> 3.1.0.RELEASE< /org.springframework-version>
< org.aspectj-version> 1.6.9< /org.aspectj-version>
< org.slf4j-version> 1.5.10< /org.slf4j-version>
< / properties>
<依赖关系>
<! - Spring - >
< dependency>
< groupId> org.springframework< / groupId>
< artifactId> spring-context< / artifactId>
< version> $ {org.springframework-version}< / version>
<排除项>
<! - 排除Commons记录SLF4j - >
<排除>
< groupId> commons-logging< / groupId>
< artifactId> commons-logging< / artifactId>
< /排除>
< /排除>
< /依赖关系>
< dependency>
< groupId> org.springframework< / groupId>
< artifactId> spring-webmvc< / artifactId>
< version> $ {org.springframework-version}< / version>
< /依赖关系>

<! - AspectJ - >
< dependency>
< groupId> org.aspectj< / groupId>
< artifactId> aspectjrt< / artifactId>
< version> $ {org.aspectj-version}< / version>
< /依赖关系>

<! - 记录 - >
< dependency>
< groupId> org.slf4j< / groupId>
< artifactId> slf4j-api< / artifactId>
< version> $ {org.slf4j-version}< / version>
< /依赖关系>
< dependency>
< groupId> org.slf4j< / groupId>
< artifactId> jcl-over-slf4j< / artifactId>
< version> $ {org.slf4j-version}< / version>
< scope>运行时< / scope>
< /依赖关系>
< dependency>
< groupId> org.slf4j< / groupId>
< artifactId> slf4j-log4j12< / artifactId>
< version> $ {org.slf4j-version}< / version>
< scope>运行时< / scope>
< /依赖关系>
< dependency>
< groupId> log4j< / groupId>
< artifactId> log4j< / artifactId>
< version> 1.2.15< / version>
<排除项>
<排除>
< groupId> javax.mail< / groupId>
< artifactId>邮件< / artifactId>
< /排除>
<排除>
< groupId> javax.jms< / groupId>
< artifactId> jms< / artifactId>
< /排除>
<排除>
< groupId> com.sun.jdmk< / groupId>
< artifactId> jmxtools< / artifactId>
< /排除>
<排除>
< groupId> com.sun.jmx< / groupId>
< artifactId> jmxri< / artifactId>
< /排除>
< /排除>
< scope>运行时< / scope>
< /依赖关系>

<! - @Inject - >
< dependency>
< groupId> javax.inject< / groupId>
< artifactId> javax.inject< / artifactId>
< version> 1< / version>
< /依赖关系>

<! - Servlet - >
< dependency>
< groupId> javax.servlet< / groupId>
< artifactId> servlet-api< / artifactId>
< version> 2.5< / version>
< scope>提供< / scope>
< /依赖关系>
< dependency>
< groupId> javax.servlet.jsp< / groupId>
< artifactId> jsp-api< / artifactId>
< version> 2.1< / version>
< scope>提供< / scope>
< /依赖关系>
< dependency>
< groupId> javax.servlet< / groupId>
< artifactId> jstl< / artifactId>
< version> 1.2< / version>
< /依赖关系>
< dependency>
< groupId> org.hibernate< / groupId>
< artifactId> hibernate-core< / artifactId>
< version> 4.1.3.Final< / version>
< /依赖关系>
< dependency>
< groupId> org.hibernate< / groupId>
< artifactId> hibernate-entitymanager< / artifactId>
< version> 4.1.1.Final< / version>
< /依赖关系>
< dependency>
< groupId> org.springframework< / groupId>
< artifactId> spring-orm< / artifactId>
< version> 3.1.1.RELEASE< / version>
< /依赖关系>
< dependency>
< groupId> cglib< / groupId>
< artifactId> cglib< / artifactId>
< version> 2.2.2< / version>
< scope>运行时< / scope>
< /依赖关系>
< dependency>
< groupId> org.hibernate.common< / groupId>
< artifactId> hibernate-commons-annotations< / artifactId>
< version> 4.0.1.Final< / version>
< /依赖关系>
< dependency>
< groupId> mysql< / groupId>
< artifactId> mysql-connector-java< / artifactId>
< version> 5.1.20< / version>
< /依赖关系>
< dependency>
< groupId> org.javassist< / groupId>
< artifactId> javassist< / artifactId>
< version> 3.15.0-GA< / version>
< /依赖关系>
< dependency>
< groupId> org.hibernate.javax.persistence< / groupId>
< artifactId> hibernate-jpa-2.0-api< / artifactId>
< version> 1.0.1.Final< / version>
< /依赖关系>

<! - Test - >
< dependency>
< groupId> junit< / groupId>
< artifactId> junit< / artifactId>
< version> 4.7< / version>
< scope> test< / scope>
< /依赖关系>
< /依赖关系>
< build>
< plugins>
< plugin>
< artifactId> maven-eclipse-plugin< / artifactId>
< version> 2.9< / version>
<配置>
< additionalProjectnatures>
< projectnature> org.springframework.ide.eclipse.core.springnature< / projectnature>
< / additionalProjectnatures>
< additionalBuildcommands>
< buildcommand> org.springframework.ide.eclipse.core.springbuilder< / buildcommand>
< / additionalBuildcommands>
< downloadSources> true< / downloadSources>
< downloadJavadocs> true< / downloadJavadocs>
< / configuration>
< / plugin>
< plugin>
< groupId> org.apache.maven.plugins< / groupId>
< artifactId> maven-compiler-plugin< / artifactId>
< version> 2.3.2< / version>
<配置>
< source> 1.6< / source>
< target> 1.6< / target>
< compilerArgument> -Xlint:all< / compilerArgument>
< showWarnings> true< / showWarnings>
< showDeprecation> true< / showDeprecation>
< / configuration>
< / plugin>
< plugin>
< groupId> org.codehaus.mojo< / groupId>
< artifactId> exec-maven-plugin< / artifactId>
< version> 1.2.1< / version>
<配置>
< mainClass> org.test.int1.Main< / mainClass>
< / configuration>
< / plugin>
< / plugins>
< / build>



servet-context:

 <! -  DispatcherServlet上下文:定义此servlet的请求处理基础结构 - > 

<! - 启用Spring MVC @Controller编程模型 - >
< annotation-driven />

<! - 通过高效地提供$ {webappRoot} / resources目录中的静态资源来处理/ resources / **的HTTP GET请求 - >
< resource mapping =/ resources / **location =/ resources //>

<! - 解析@Controllers为/ WEB-INF / views目录中的.jsp资源选择渲染的视图 - >
< beans:bean class =org.springframework.web.servlet.view.InternalResourceViewResolver>
< beans:property name =prefixvalue =/ WEB-INF / views //>
< beans:property name =suffixvalue =。jsp/>
< / beans:bean>

< context:component-scan base-package =com.reservosity.component.controller/>



root-context.xml :

 <! - 根上下文:定义所有其他Web组件可见的共享资源 - > 


< bean id =sessionFactory
class =org.springframework.orm.hibernate4.LocalSessionFactoryBean>
< property name =configLocation>
< value> classpath:hibernate.cfg.xml< / value>
< / property>
< / bean>
< tx:注解驱动的事务管理器=transactionManager/>

< bean id =transactionManagerclass =org.springframework.orm.hibernate4.HibernateTransactionManager>
< property name =sessionFactoryref =sessionFactory/>
< / bean>

hibernate.cfg.xml:

 <?xml version ='1.0'encoding ='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC
- // Hibernate / Hibernate配置DTD // EN
http://hibernate.sourceforge.net/hibernate-configuration-3.0。 DTD>
< hibernate-configuration>
< session-factory>
< property name =hibernate.connection.driver_class> com.mysql.jdbc.Driver< / property>
< property name =hibernate.connection.url> jdbc:mysql:// localhost:3306 / ******< / property>
< property name =hibernate.connection.username> ***< / property>
< property name =hibernate.connection.password> ***< / property>
< property name =hibernate.connection.pool_size> 10< / property>
< property name =show_sql> true< / property>
< property name =dialect> org.hibernate.dialect.MySQLDialect< / property>
< property name =hibernate.current_session_context_class>线程< / property>
< mapping class =com.company.component.domain.Company/>
< / session-factory>





如果我删除bean transactionManager,它可以正常工作,但是当我再次添加它时,我会看到那个看起来很脏的错误。不知道为什么。

 < bean id =transactionManagerclass =org.springframework.orm.hibernate4.HibernateTransactionManager> ; 
< property name =sessionFactoryref =sessionFactory/>
< / bean>

我是春季休眠的新手,真的可以帮忙!



谢谢

Andrew 我有完全相同的问题。 KyelJmD建议此处表示缺少连接池,看起来他是对的,但他没有发布解决方案。



所以我花了一些时间,最终得到它的工作。为了解决这个问题,你应该做两件事:


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

     < property name =hibernate.c3p0.min_size> 5< /&性> 
    < property name =hibernate.c3p0.max_size> 20< / property>
    < property name =hibernate.c3p0.timeout> 300< / property>
    < property name =hibernate.c3p0.max_statements> 50< / property>
    < property name =hibernate.c3p0.idle_test_period> 3000< / property>


  2. 在pom.xml中添加这些依赖项:

     < dependency> 
    < groupId> org.hibernate< / groupId>
    < artifactId> hibernate-c3p0< / artifactId>
    < version> 4.1.9.Final< / version>
    < /依赖关系>

    < dependency>
    < groupId> org.hibernate< / groupId>
    < artifactId> hibernate-ehcache< / artifactId>
    < version> 4.1.9.Final< / version>
    < /依赖关系>




  3. 没有Maven依赖关系Hibernate只是默默地忽略C3P0配置。

    通过上面的配置,我不会再发生UnknownUnwrapTypeException异常,现在看起来效果很好。



    我的设置:Spring 3.2.1,Hibernate 4.1.9,Tomcat 7.0.35。



    免责声明:如问题,你不应该使用hibernate.cfg.xml文件。这个问题,你不应该使用hibernate.cfg.xml文件。使用 dataSource bean代替,因为,例如,您可以稍后在JdbcTemplate中使用它。
    $ b 编辑:



    我回答这个问题已经有一段时间了。这似乎是正确的,但我从来不喜欢它,因为这是一种猜测,我们应该避免这种猜测。

    所以,因为我发现这个间隔,我无法在Hibernate 4.1 docs中找到任何东西,我试图证明我和其他评论者猜。



    这是一个循序渐进的过程,可能对解决其他问题也很有用其他图书馆的奇怪问题。
    这次发现真的很简单,发生了什么。



    1. 创建一个Maven项目(或使用现有的项目),将Hibernate添加到依赖项(hibernate-entitymanager,我使用的是此版本的4.1.7 )。将它导入到可以自动附加源代码的IDE中(我使用了Intellij)
    2. 从堆栈跟踪中找到异常类( UnknownUnwrapTypeException )已被引发( DriverManagerConnectionProviderImpl )并在那里导航(CTRL-N和类型名称),点击下载源代码。

    3. 查找的用法> DriverManagerConnectionProviderImpl (ALT + F7)

    4. Voila!原来在<$ c中只有一个用法 DriverManagerConnectionProviderImpl - 它是一个 initiateService(...)方法$ c> ConnectionProviderInitiator ,它或多或少地尝试一对 ConnectionProvider 实现,然后再回到 DriverManagerConnectionProviderImpl ,在我们的例子中不起作用并抛出 UnknownUnwrapTypeException

    从Hibernate的ConnectionProviderInitiator.java:

      ConnectionProvider connectionProvider = null; 
    字符串providerClassName = getConfiguredConnectionProviderName(configurationValues);
    if(providerClassName!= null){
    connectionProvider = instantiateExplicitConnectionProvider(providerClassName,classLoaderService);

    else if(configurationValues.get(Environment.DATASOURCE)!= null){
    connectionProvider = new DatasourceConnectionProviderImpl(); (c3p0ConfigDefined(configurationValues)&& c3p0ProviderPresent(classLoaderService)){
    connectionProvider = instantiateExplicitConnectionProvider(C3P0_PROVIDER_CLASS_NAME){
    }

    if(connectionProvider == null){
    if ,
    classLoaderService
    );


    $ b $ 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提供程序将被实例化

    3. 检查一些其他提供程序(PROXOOL_PROVIDER_CLASS_NAME)如果存在 Environment.URL (hibernate.connection.url),我们使用 DriverManagerConnectionProviderImpl

    就是这样。这就解释了为什么如果我们将C3P0添加为Maven Dependency或定义DataSource(如 Michael ako Tecourt 在下面评论中所述)解决了这个问题。另一个问题是DriverManagerConnectionProviderImpl抛出UnknownUnwrapTypeException - 为什么它是一个错误 - 无论如何,我没有看到Hibernate 4.2中的代码有任何改变.0甚至4.3.0.Beta。

    I am getting an error in my application but I'm not sure what it means. I posted some sample code bellow. This is the error I get:

    > 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
    

    This is my pom file:

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.reservosity</groupId>
    <artifactId>component</artifactId>
    <name>Reservosity</name>
    <packaging>war</packaging>
    <version>1.0.0-BUILD-SNAPSHOT</version>
    <properties>
        <java-version>1.6</java-version>
        <org.springframework-version>3.1.0.RELEASE</org.springframework-version>
        <org.aspectj-version>1.6.9</org.aspectj-version>
        <org.slf4j-version>1.5.10</org.slf4j-version>
    </properties>
    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
            <exclusions>
                <!-- Exclude Commons Logging in favor of SLF4j -->
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
    
        <!-- AspectJ -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org.aspectj-version}</version>
        </dependency>
    
        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j-version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.mail</groupId>
                    <artifactId>mail</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
            </exclusions>
            <scope>runtime</scope>
        </dependency>
    
        <!-- @Inject -->
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>
    
        <!-- Servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.1.3.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.1.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>4.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.20</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.15.0-GA</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>
    
        <!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    The servet-context:

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
    
    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />
    
    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />
    
    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
    
    <context:component-scan base-package="com.reservosity.component.controller" />
    

    The root-context.xml:

    <!-- Root Context: defines shared resources visible to all other web components -->
    
    
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />
    
    <bean id="transactionManager"    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    

    The hibernate.cfg.xml:

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN"
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     <hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/******</property>
        <property name="hibernate.connection.username">***</property>
        <property name="hibernate.connection.password">***</property>
        <property name="hibernate.connection.pool_size">10</property>
        <property name="show_sql">true</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <mapping class="com.company.component.domain.Company" />
    </session-factory>
    

    If I remove the bean transactionManager, it works fine, but when I add it in again, I get that dirty looking error. Not sure why.

        <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    

    I am new to spring hibernate and could really do with some help!

    Thanks

    Andrew

    解决方案

    I've exactly the same problem. KyelJmD suggests here that there is a missing connection pooling, and it seems he is right, but he didn't post solution.

    So I've spent some time and finaly get it working. To solve this problem you should do two things:

    1. add these lines into hibernate.cfg.xml file (it's possible that you don't need all of it):

      <property name="hibernate.c3p0.min_size">5</property>
      <property name="hibernate.c3p0.max_size">20</property>
      <property name="hibernate.c3p0.timeout">300</property>
      <property name="hibernate.c3p0.max_statements">50</property>
      <property name="hibernate.c3p0.idle_test_period">3000</property>
      

    2. Add this dependencies in pom.xml:

      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-c3p0</artifactId>
          <version>4.1.9.Final</version>
      </dependency>
      
      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-ehcache</artifactId>
          <version>4.1.9.Final</version>
      </dependency>
      

    Without maven dependency Hibernate just silently ignores C3P0 configuration.

    With above configuration I dont't get anymore UnknownUnwrapTypeException exception, and it seems it works fine now.

    My setup: Spring 3.2.1, Hibernate 4.1.9, Tomcat 7.0.35.

    Dislaimer: as stated in this question, you should rather not use hibernate.cfg.xml file. Use dataSource bean instead, because, for example, you can use it later for JdbcTemplate.

    EDIT :

    It's been a while, as I answered this question. It seemed correct, but I never like it, because it was kind of guess, which we should really avoid.

    So, because I found this interresting and I was unable to find anything in Hibernate 4.1 docs, I tried to proof my and other commenters "guess".

    Here is a step-by-step procedure, probably also useful for solving other weird issues in other libraries. Turns out this time it was really easy, what is going on.

    1. Create a Maven Project (or use existing one), add Hibernate to dependency (hibernate-entitymanager, I used this time version 4.1.7). Import it into IDE which can automatically attach source code (I used Intellij)
    2. From Stack Trace, find the class where exception (UnknownUnwrapTypeException) has been thrown (DriverManagerConnectionProviderImpl) and navigate there (CTRL-N and type class name), click "Download sources".
    3. Find usages of DriverManagerConnectionProviderImpl (ALT+F7)
    4. Voila! Turns out there is only one usage of DriverManagerConnectionProviderImpl - it is a initiateService(...) method in ConnectionProviderInitiator, which - more or less - tries a couple ConnectionProvider implementations, before it fallbacks to DriverManagerConnectionProviderImpl, which in our case doesn't work and throws UnknownUnwrapTypeException.

    From Hibernate's 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();
        }
    

    The code roughly shows that:

    1. If Environment.DATASOURCE (hibernate.connection.datasource) is set, then DatasourceConnectionProviderImpl is used;
    2. If there is c3p0 present, then C3P0 Provider is instantiated
    3. Some other provider is checked (PROXOOL_PROVIDER_CLASS_NAME)
    4. Then if Environment.URL (hibernate.connection.url) is present, we use DriverManagerConnectionProviderImpl.

    And that's it. This explains why if we add C3P0 as Maven Dependency or define DataSource (as Michael ako Tecourt says in comment below) solves the issue.

    Another matter is why DriverManagerConnectionProviderImpl throws UnknownUnwrapTypeException - wheather it is a bug or not - anyway, I don't see any changes in code in Hibernate 4.2.0 and even 4.3.0.Beta.

    这篇关于Spring源码套件spring3 + Hibernate4 + maven 3 + MySQL 5的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆