首页 > 解决方案 > 从 Hibernate 3.5 升级到 Hibernate 5.5.x 最新问题

问题描述

我的最新项目是将基于 Java Web 的应用程序从 Hibernate 3.5.6-Final 转换为最新的 Hibernate 5.5.4.Final。这个应用程序(还)不使用 Spring,所以现在,它创建了自己的与数据库的 JDBC 连接。

以下是最新的 Maven 依赖项:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.5.4.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>5.5.4.Final</version>
</dependency>

当我更新 pom.xml 时,它当然会产生很多错误和警告,而这些错误是我要修复的第一件事。我检查了所有代码并通过用新类替换旧类并添加未实现的类并删除对不再需要的方法的调用来解决这些问题。代码现在编译得很好,但是,当我运行应用程序时,我收到以下错误消息:

java.lang.NoClassDefFoundError: org/hibernate/cache/access/AccessType
at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166)
at java.base/java.lang.Class.privateGetPublicMethods(Class.java:3191)
at java.base/java.lang.Class.getMethods(Class.java:1904)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.applyInjections(AbstractServiceRegistryImpl.java:292)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:283)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
at org.hibernate.boot.internal.MetadataBuilderImpl$MetadataBuildingOptionsImpl.<init>(MetadataBuilderImpl.java:718)
at org.hibernate.boot.internal.MetadataBuilderImpl.<init>(MetadataBuilderImpl.java:123)
at org.hibernate.boot.MetadataSources.getMetadataBuilder(MetadataSources.java:158)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:673)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:744)
at com.ekotrope.server.services.db.service.PersistenceManager.buildSessionFactory(PersistenceManager.java:508)

我知道我们的代码是错误信息的最后一行。那条线是:

 SessionFactory sessionFactory = config.buildSessionFactory();

正如您在错误消息中看到的那样,这深入到了 Hibernate 代码,最后归结为:

 java.lang.NoClassDefFoundError: org/hibernate/cache/access/AccessType

我知道这个类来自 Hibernate 3.5,我不知道为什么会出现这种情况。我知道正确的课程是:

    org.hibernate.cache.spi.access.AccessType

我检查了 Maven 依赖项以查看混合中是否有任何其他 Hibernate jar,但我没有看到任何。所以,我正在寻找解决这个问题,任何帮助将不胜感激。

标签: javahibernate

解决方案


问题是我们在使用 Hibernate 3 时遇到的旧 ehcache。

  1. 我们没有在 pom.xml 中定义任何旧的 hibernate-ehcache,而且我们当时在 Hibernate 3 中也不需要它。

  2. 我们使用 maven 中定义的旧 ehcache:

    <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.11</version>
    </dependency>
    

有了这个,primary-hibernate.cfg.xml 对二级 Hibernate 缓存进行了以下设置。

<property name="cache.provider_class">
    net.sf.ehcache.hibernate.EhCacheProvider
</property>
<property name="hibernate.cache.region.factory_class">
    net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
</property>

好吧,我们不仅从 Hibernate 3 更新到最新的 Hibernate 5,并添加了最新的“hibernate-ehcache”,而且我们还更新了这个 EhCache,如 Maven pom.xml 所示。

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

 <dependency>
      <groupId>org.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>3.8.1</version>
</dependency>  

有了这个,我们修改了二级缓存的primary-hibernate.cfg.xml,如下所示。

<property name="cache.provider_class">
    org.hibernate.cache.EhCacheProvider
</property>
<property name="hibernate.cache.region.factory_class">
    org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>

我们确实搜索了我们的代码,以确保我们将所有出现的“net.sf.ehcache”替换为较新的 ehcache 类。

现在,我可以构建和编译我的代码,这很有效。


推荐阅读