我有完全一样的问题。KyelJmD 在这里建议缺少连接池,看来他是正确的,但是他没有发布解决方案。
因此,我花了一些时间并最终使它工作。要解决此问题,您应该做两件事:
- 将这些行添加到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>
- 在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文件。请改用
dataSourcebean,因为例如,以后可以将其用于JdbcTemplate。
编辑:
我回答这个问题已经有一段时间了。这似乎是正确的,但我从来不喜欢它,因为这是一种猜测,我们应该避免。
因此,因为我发现了这个问题,并且无法在Hibernate 4.1文档中找到任何内容,所以我试图证明我的评论者和其他评论者“猜测”。
这是一个分步过程,可能对解决其他库中的其他怪异问题也很有用。事实证明,这次确实很容易,发生了什么。
- 创建一个Maven项目(或使用现有项目),将Hibernate添加到依赖项中(hibernate-entitymanager,我使用的是此版本4.1.7)。将其导入可以自动附加源代码的IDE(我使用Intellij)
- 在堆栈跟踪中,找到
UnknownUnwrapTypeException
引发了异常()的类(DriverManagerConnectionProviderImpl
),然后在其中进行导航(CTRL-N并键入类名),单击“下载源代码”。 - 查找
DriverManagerConnectionProviderImpl
(ALT + F7)的用法 - 瞧!事实证明,只有一种用法
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(); }该代码大致显示:
- 如果
Environment.DATASOURCE
设置了(hibernate.connection.datasource),则DatasourceConnectionProviderImpl
使用; - 如果存在c3p0,则实例化C3P0 Provider
- 检查了其他提供者(PROXOOL_PROVIDER_CLASS_NAME)
- 然后,如果存在
Environment.URL
(hibernate.connection.url),则使用DriverManagerConnectionProviderImpl
。
就是这样。这解释了为什么我们将C3P0添加为Maven Dependency或定义DataSource可以解决问题。
另一个问题是为什么DriverManagerConnectionProviderImpl抛出UnknownUnwrapTypeException-
不管它是否是错误-无论如何,我看不到Hibernate 4.2.0甚至4.3.0.Beta中的代码有任何更改。



