栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring源套件spring3 + Hibernate4 + maven 3 + MySQL 5

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring源套件spring3 + Hibernate4 + maven 3 + MySQL 5

我有完全一样的问题。KyelJmD 在这里建议缺少连接池,看来他是正确的,但是他没有发布解决方案。

因此,我花了一些时间并最终使它工作。要解决此问题,您应该做两件事:

  1. 将这些行添加到hibernate.cfg.xml文件中(可能不需要全部):
        <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>
  1. 在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>

没有Maven依赖,Hibernate只会默默地忽略C3P0配置。

通过以上配置,我不再遇到UnknownUnwrapTypeException异常,现在看来它可以正常工作。

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

免责声明:如本问题所述,您不应该使用hibernate.cfg.xml文件。请改用

dataSource
bean,因为例如,以后可以将其用于JdbcTemplate。

编辑:

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

因此,因为我发现了这个问题,并且无法在Hibernate 4.1文档中找到任何内容,所以我试图证明我的评论者和其他评论者“猜测”。

这是一个分步过程,可能对解决其他库中的其他怪异问题也很有用。事实证明,这次确实很容易,发生了什么。

  1. 创建一个Maven项目(或使用现有项目),将Hibernate添加到依赖项中(hibernate-entitymanager,我使用的是此版本4.1.7)。将其导入可以自动附加源代码的IDE(我使用Intellij)
  2. 在堆栈跟踪中,找到
    UnknownUnwrapTypeException
    引发了异常()的类(
    DriverManagerConnectionProviderImpl
    ),然后在其中进行导航(CTRL-N并键入类名),单击“下载源代码”。
  3. 查找
    DriverManagerConnectionProviderImpl
    (ALT + F7)的用法
  4. 瞧!事实证明,只有一种用法
    DriverManagerConnectionProviderImpl
    -它是其中的一种
    initiateService(...)
    方法
    ConnectionProviderInitiator
    -
    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 Dependency或定义DataSource可以解决问题。

另一个问题是为什么DriverManagerConnectionProviderImpl抛出UnknownUnwrapTypeException-
不管它是否是错误-无论如何,我看不到Hibernate 4.2.0甚至4.3.0.Beta中的代码有任何更改。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/421862.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号