从Hibernate 5.2升级到5.3时,SingletonEhCacheRegionFactory不再可用 [英] SingletonEhCacheRegionFactory is no longer available when upgrading from Hibernate 5.2 to 5.3

查看:67
本文介绍了从Hibernate 5.2升级到5.3时,SingletonEhCacheRegionFactory不再可用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理的项目当前正在使用Hibernate版本5.2.15.Final.配置第二级缓存时,项目一直使用 org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory 作为 hibernate.cache.region.factory_class 的值.

当我将Hibernate版本更改为5.3.12.Final时,该程序包中不再包含 SingletonEhCacheRegionFactory .net.sf.ehcache.hibernate 包中提供了具有相同名称的类,并且我可以使用该类而不会产生编译错误.但是,如果我运行它,则在尝试建立会话时会出错:

  org.hibernate.service.spi.ServiceException:无法创建请求的服务[org.hibernate.cache.spi.RegionFactory]在org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275)在org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)在org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)在org.hibernate.boot.internal.MetadataBuilderImpl $ MetadataBuildingOptionsImpl.< init>(MetadataBuilderImpl.java:688)在org.hibernate.boot.internal.MetadataBuilderImpl.< init>(MetadataBuilderImpl.java:123)在org.hibernate.boot.internal.MetadataBuilderImpl.< init>(MetadataBuilderImpl.java:93) 

如果我更深入地研究堆栈跟踪,则真正的错误似乎是这样的:

 原因:org.hibernate.boot.registry.selector.spi.StrategySelectionException:无法将名称[net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory]解析为策略[org.hibernate.cache.spi.RegionFactory]在org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:133)上在org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveStrategy(StrategySelectorImpl.java:212)在org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveStrategy(StrategySelectorImpl.java:169)在org.hibernate.cache.internal.RegionFactoryInitiator.resolveRegionFactory(RegionFactoryInitiator.java:93)在org.hibernate.cache.internal.RegionFactoryInitiator.initiateService(RegionFactoryInitiator.java:47)在org.hibernate.cache.internal.RegionFactoryInitiator.initiateService(RegionFactoryInitiator.java:32)在org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94)在org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)...还有64个原因:org.hibernate.boot.registry.classloading.spi.ClassLoadingException:无法加载类[net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory]在org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:137)在org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:129)上...另外71个造成原因:java.lang.NoClassDefFoundError:org/hibernate/cache/QueryResultsRegion在java.base/java.lang.Class.forName0(本地方法)在java.base/java.lang.Class.forName(Class.java:374)在org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:131)...另外72个引起原因:java.lang.ClassNotFoundException:org.hibernate.cache.QueryResultsRegion在java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)在java.base/jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass(ClassLoaders.java:190)在java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)...另外75个 

这是我的pom.xml依赖项的样子:

 < dependency>< groupId> org.hibernate</groupId>< artifactId>休眠核心</artifactId>< version> 5.3.12.Final</version></dependency><依赖关系>< groupId> org.hibernate</groupId>< artifactId> hibernate-ehcache</artifactId>< version> 5.3.12.Final</version></dependency><依赖关系>< groupId> net.sf.ehcache</groupId>< artifactId> ehcache-core</artifactId>< version> 2.6.11</version><排除项><排除>< groupId> org.slf4j</groupId>< artifactId> slf4j-api</artifactId></exclusion></exclusions></dependency><依赖关系>< groupId> org.hibernate</groupId>< artifactId>休眠-c3p0</artifactId>< version> 5.3.12.Final</version></dependency> 

解决方案

好的,我想我已经解决了问题.以前,我的代码通过执行以下操作来获取完整的类名和路径:

  SingletonEhCacheRegionFactory.class.getCanonicalName() 

但是在Hibernate 5.3中,该类已移至内部包中,这就是为什么我无法找到它的原因.如果我使用带有旧程序包名称的硬编码字符串("org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory" ),则不会再出现该异常.

A project I work on is currently using Hibernate version 5.2.15.Final. When configuring the second-level cache, the project has been using org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory as the value for hibernate.cache.region.factory_class.

When I change the Hibernate version to 5.3.12.Final, SingletonEhCacheRegionFactory is no longer in that package. A class with that same name is available in the net.sf.ehcache.hibernate package, and I can use that with no compilation errors. But if I run it I get an error when it tries to build a session:

org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.cache.spi.RegionFactory]

    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
    at org.hibernate.boot.internal.MetadataBuilderImpl$MetadataBuildingOptionsImpl.<init>(MetadataBuilderImpl.java:688)
    at org.hibernate.boot.internal.MetadataBuilderImpl.<init>(MetadataBuilderImpl.java:123)
    at org.hibernate.boot.internal.MetadataBuilderImpl.<init>(MetadataBuilderImpl.java:93)

If I dig deeper into the stack trace, the real error seems to be this:

Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory] as strategy [org.hibernate.cache.spi.RegionFactory]
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:133)
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveStrategy(StrategySelectorImpl.java:212)
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveStrategy(StrategySelectorImpl.java:169)
    at org.hibernate.cache.internal.RegionFactoryInitiator.resolveRegionFactory(RegionFactoryInitiator.java:93)
    at org.hibernate.cache.internal.RegionFactoryInitiator.initiateService(RegionFactoryInitiator.java:47)
    at org.hibernate.cache.internal.RegionFactoryInitiator.initiateService(RegionFactoryInitiator.java:32)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
    ... 64 more
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory]
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:137)
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:129)
    ... 71 more
Caused by: java.lang.NoClassDefFoundError: org/hibernate/cache/QueryResultsRegion
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:374)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:131)
    ... 72 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.QueryResultsRegion
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
    ... 75 more

Here's what my pom.xml dependencies look like:

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

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.6.11</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>5.3.12.Final</version>
</dependency>

解决方案

Okay, I think I figured out the problem. Previously my code had been fetching the full class name and path by doing:

SingletonEhCacheRegionFactory.class.getCanonicalName()

But in Hibernate 5.3 the class had been moved to an internal package, which is why I could no longer find it. If I used a hardcoded string with the old package name ("org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"), I no longer get that exception.

这篇关于从Hibernate 5.2升级到5.3时,SingletonEhCacheRegionFactory不再可用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆