【问题标题】:Hibernate 4 ConnectionProvider Class not found未找到休眠 4 ConnectionProvider 类
【发布时间】:2014-05-25 22:32:01
【问题描述】:

我刚刚将我的应用程序中的 Hibernate 更新为 4.3.4(从 3.X 开始),这导致了一些问题。第一个是创建 sessionFactory 的新方法,我解决了。

下一个我没有发现的问题是,我现在在 org.hibernate.connection.ConnectionProvider 上遇到了 ClassNotFoundException

需要注意的是,我的连接池使用的是 BoneCP (0.7.1),它在升级之前就可以工作。

任何帮助将不胜感激。我对休眠很陌生(我正在努力将其作为 POC 实现),因此我可能在此处的描述中遗漏了一些重要的细节。 我不需要它是最新版本,所以我可以恢复,但如果有最新最好的版本就好了:)

谢谢!

Hibernate.cfg.xml sn-p(已替换敏感信息):

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">foo</property>
        <property name="hibernate.connection.username">bob</property>
        <property name="hibernate.default_schema">bar</property>
        <property name="hibernate.dialect">package.path.MySQLCustomDialect</property>

        <!-- Bonecp connection pool -->
        <property name="hibernate.connection.provider_class">com.jolbox.bonecp.provider.BoneCPConnectionProvider</property>
        <property name="bonecp.maxConnectionAgeInMinutes">5</property>
        <property name="bonecp.idleConnectionTestPeriodInMinutes">0</property>
        and so on ...

堆栈跟踪:

Exception in thread "Thread-110" java.lang.NoClassDefFoundError: org/hibernate/connection/ConnectionProvider
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2895)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1173)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1681)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader.findClass(ClassLoaderServiceImpl.java:222)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:249)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:240)
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:125)
    at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:194)
    at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:120)
    at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:55)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:83)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:223)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:197)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:89)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
    at foo.utils.HibernateUtils.<clinit>(HibernateUtils.java:16)
    at foo.objects.building.BuildingHelper.getBuildingByID(BuildingHelper.java:225)
    at foo.objects.inventory.LocationInformation.<init>(LocationInformation.java:36)
    at foo.objects.computermanagementframework.peripheral.PeripheralHelper.readLocation(PeripheralHelper.java:154)
    at foo.objects.computermanagementframework.peripheral.PeripheralHelper.refresh(PeripheralHelper.java:556)
    at foo.server.initialization.InitializeServerThread.run(InitializeServerThread.java:298)
    at java.lang.Thread.run(Thread.java:695)
Caused by: java.lang.ClassNotFoundException: org.hibernate.connection.ConnectionProvider
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    ... 36 more

【问题讨论】:

  • 你使用maven构建项目吗?
  • 您的构建路径中是否存在包含类com.jolbox.bonecp.provider.BoneCPConnectionProvider 的库(jar)?
  • 是的,这是一个 Maven 项目。我的构建路径中有 bonecp-0.8.0.RELEASE 和 bonecp-provider-0.7.1.RELEASE(也是 maven 依赖项)

标签: java hibernate exception classnotfoundexception


【解决方案1】:

Hibernate 不断更改包含ConnectionProvider 基类的包。它从第 3 版更改为第 4 版,并在 4.3 版中再次更改。 正如@teresa-carrigan 在对this answer 的评论中提到的那样,您必须编译最新的BoneCPConnectionProvider.java(目前支持Hibernate 4.3.1)并使用它。
或者使用 Hibernate 4.2.12.Final 版本,看看它是否适用于 BoneCP 0.8(如上述答案中所述)。

【讨论】:

  • 使用 BoneCP 0.8 回到 4.2.10 有效。感谢您的提示!