java - 从 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,但我没有看到任何。所以,我正在寻找解决这个问题,任何帮助将不胜感激。
解决方案
问题是我们在使用 Hibernate 3 时遇到的旧 ehcache。
我们没有在 pom.xml 中定义任何旧的 hibernate-ehcache,而且我们当时在 Hibernate 3 中也不需要它。
我们使用 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 类。
现在,我可以构建和编译我的代码,这很有效。
推荐阅读
- gremlin - 在 gremlin(特别是 tinkerpop)中,您如何查询,然后在没有第一个查询的任何结果的情况下进行第二个查询?
- python - re.sub 不会替换一个非常简单的正则表达式
- excel - excel自定义函数加载项中的socket-cluster客户端问题
- java - 使用 Spring Boot 和 AWS 编写大文件的最佳方法
- prometheus - Prometheus 错误:无法加载配置。找到多个抓取配置
- javascript - 尝试使用高级驱动器 api 将 .xls 转换为 google sheet 时,“我们很抱歉,发生服务器错误。请稍候,然后重试”
- python - 如何生成和导出python库的自定义子库?
- r - 基于 R 中的查找表聚合矩阵
- javascript - 在 Javascript 中创建连接四:循环按钮以创建网格 (?)
- react-native - 从 Drawer Navigator 导航到特定屏幕