java 升级到 Hibernate 5 时 SessionFactoryImpl 中的 AbstractMethodError

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32448957/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 20:13:02  来源:igfitidea点击:

AbstractMethodError in SessionFactoryImpl when upgrading to Hibernate 5

javaspringhibernatejpahibernate-5.x

提问by ThrawnCA

We're using Spring ORM 4.2.1.RELEASE to interact with Hibernate via JPA. Everything works fine with Hibernate 4.3.11.Final, but when we try to upgrade to Hibernate 5, it breaks with an AbstractMethodError when constructing the SessionFactory.

我们使用 Spring ORM 4.2.1.RELEASE 通过 JPA 与 Hibernate 交互。在 Hibernate 4.3.11.Final 中一切正常,但是当我们尝试升级到 Hibernate 5 时,在构造 SessionFactory 时它会因 AbstractMethodError 而中断。

According to the release notes, Spring 4.2.1 does support Hibernate 5. Examining the Maven dependency tree didn't show any duplicate or obsolete versions of Hibernate or Spring. The specific line that is reported (https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.javaline 278) is iterating over Hibernate integrators, but we don't use any, so the list of integrators should logically be empty (and thus not iterate).

根据发行说明,Spring 4.2.1 确实支持 Hibernate 5。检查 Maven 依赖关系树没有显示任何重复或过时的 Hibernate 或 Spring 版本。报告的特定行(https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java第 278 行)正在迭代Hibernate 积分器,但我们不使用任何积分器,因此积分器列表在逻辑上应该是空的(因此不会迭代)。

Does anyone know whether this is a bug (or lack of support) in Spring, or if we're doing something wrong?

有谁知道这是 Spring 中的错误(或缺乏支持),还是我们做错了什么?

Extract from application log:

从应用程序日志中提取:

2015-09-08 13:17:45,452 [main] INFO  org.springframework.test.context.support.DefaultTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@20f0461e, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@7e8b6c76, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@737df7e1, org.springframework.test.context.support.DirtiesContextTestExecutionListener@531d1003, org.springframework.test.context.transaction.TransactionalTestExecutionListener@19065f96, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@716d7daf]
2015-09-08 13:17:45,460 [main] INFO  org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [dataContext.xml]
2015-09-08 13:17:45,689 [main] INFO  org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [systemContext.xml]
2015-09-08 13:17:45,779 [main] INFO  org.springframework.context.support.GenericApplicationContext - Refreshing org.springframework.context.support.GenericApplicationContext@4b56a656: startup date [Tue Sep 08 13:17:45 AEST 2015]; root of context hierarchy
2015-09-08 13:17:45,846 [main] INFO  org.springframework.context.support.PropertySourcesPlaceholderConfigurer - Loading properties file from class path resource [application.properties]
2015-09-08 13:17:45,900 [MLog-Init-Reporter] INFO  com.mchange.v2.log.MLog - MLog clients using slf4j logging.
2015-09-08 13:17:45,921 [main] INFO  com.mchange.v2.c3p0.C3P0Registry - Initializing c3p0-0.9.5.1 [built 16-June-2015 00:06:36 -0700; debug? true; trace: 10]
2015-09-08 13:17:46,046 [main] INFO  org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'default'
2015-09-08 13:17:46,060 [main] INFO  org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
2015-09-08 13:17:46,136 [main] INFO  org.hibernate.Version - HHH000412: Hibernate Core {5.0.1.Final}
2015-09-08 13:17:46,137 [main] INFO  org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
2015-09-08 13:17:46,138 [main] INFO  org.hibernate.cfg.Environment - HHH000021: Bytecode provider name : javassist
2015-09-08 13:17:46,166 [main] INFO  org.hibernate.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
2015-09-08 13:17:46,274 [main] INFO  com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> z8kfsx9b1bfny2k11h75wx|4aa092d5, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> org.hsqldb.jdbcDriver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> z8kfsx9b1bfny2k11h75wx|4aa092d5, idleConnectionTestPeriod -> 30, initialPoolSize -> 3, jdbcUrl -> jdbc:hsqldb:mem:testDB, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> true, testConnectionOnCheckout -> true, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
2015-09-08 13:17:46,396 [main] INFO  org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.HSQLDialect
2015-09-08 13:17:46,429 [main] INFO  org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl - HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
2015-09-08 13:17:46,592 [main] WARN  org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [dataContext.xml]: Invocation of init method failed; nested exception is java.lang.AbstractMethodError
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:305) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1045) ~[spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:824) ~[spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) [spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125) [spring-test-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    ... rows deleted
Caused by: java.lang.AbstractMethodError
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:278) ~[hibernate-core-5.0.1.Final.jar:5.0.1.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[hibernate-core-5.0.1.Final.jar:5.0.1.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:802) ~[hibernate-entitymanager-5.0.1.Final.jar:5.0.1.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) ~[spring-orm-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) ~[spring-orm-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE]
    ... 41 more

Extract from Spring context:

从 Spring 上下文中提取:

<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    <property name="packagesToScan" value="au.gov.qld.ssq.cofa.domain"/>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.dialect" value="${hibernate.dialect}"/>
            <entry key="hibernate.show_sql" value="${hibernate.show_sql}"/>
            <entry key="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}"/>
        </map>
    </property>
</bean>

回答by Aleksander Blomsk?ld

This error has nothing to do with Spring. You have an Hibernate 5 incompatible Integratorin your classpath. These are detected through the ServiceRegistry.

此错误与 Spring 无关。您的类路径中有一个 Hibernate 5 不兼容的集成器。这些是通过 ServiceRegistry 检测到的。

A common issue is older versions of Jadira Usertypewhich is not compatible with Hibernate 5. If you have Jadira User type prior to version 5.0.0 in your classpath you will get this exception. If that is not the case for you, and you are unsure of which library you are having an issue with, put a breakpoint on line 278 of SessionFactoryImpland check out the class of the Integrator that causes the exception.

一个常见问题是旧版本的Jadira Usertype,它与 Hibernate 5 不兼容。如果您的类路径中有 5.0.0 版之前的 Jadira User 类型,您将收到此异常。如果您不是这种情况,并且您不确定哪个库有问题,请在 SessionFactoryImpl 的第 278 行放置一个断点并检查导致异常的集成器的类。