Spring 4.3.0.RELEASE + Hibernate 5.2.0.Final + JPA Repository

尝试使用Spring JPA时出现此错误:

无法打开JPA EntityManager进行交易; 嵌套exception是java.lang.NoSuchMethodError:org.hibernate.Session.getFlushMode()Lorg / hibernate / FlushMode;

**更新:完整堆栈跟踪

它在不同的项目中使用相同的配置

可能是什么原因? 我正在使用Java 1.8和动态Web应用程序3.1(作为可行的并行项目)

pom.xml中:

 4.0.0 Test Test 0.0.1-SNAPSHOT war  src   org.apache.maven.plugins maven-compiler-plugin 3.5.1  1.8 1.8 -Xlint:all true true WebContent\WEB-INF\web.xml false    org.codehaus.mojo exec-maven-plugin 1.2.1  org.test.int1.Main        org.springframework spring-context 4.3.0.RELEASE    commons-logging commons-logging     org.springframework spring-webmvc 4.3.0.RELEASE   org.springframework spring-tx 4.3.0.RELEASE   org.springframework spring-web 4.3.0.RELEASE   org.springframework.data spring-data-jpa 1.10.2.RELEASE   org.springframework.security spring-security-config 4.1.0.RELEASE   org.springframework.security spring-security-web 4.1.0.RELEASE    org.hibernate hibernate-entitymanager 5.1.0.Final   org.hibernate hibernate-core 5.2.0.Final   org.hibernate hibernate-validator 5.3.0.Alpha1    aspectj aspectjrt 1.5.4    org.slf4j slf4j-api 1.7.21   org.slf4j jcl-over-slf4j 1.7.21 runtime   org.slf4j slf4j-log4j12 1.7.21 runtime   log4j log4j 1.2.17   javax.mail mail   javax.jms jms   com.sun.jdmk jmxtools   com.sun.jmx jmxri   runtime    commons-dbcp commons-dbcp 1.4    javax.transaction jta 1.1    javax.servlet javax.servlet-api 3.1.0 provided   javax.servlet.jsp jsp-api 2.2   javax.servlet jstl 1.2    

完全错误:

 [16/08/16 10:41:57:057 IDT] INFO web.DefaultSecurityFilterChain: Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.SecurityContextPersistenceFilter@2b00cbc, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@1e44b04e, org.springframework.security.web.header.HeaderWriterFilter@46828666, org.springframework.security.web.csrf.CsrfFilter@7d5376a4, org.springframework.security.web.authentication.logout.LogoutFilter@7f04505e, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@44f95930, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@161a567f, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@709ae44e, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@2d41cca3, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@23ff20e2, org.springframework.security.web.session.SessionManagementFilter@6792334c, org.springframework.security.web.access.ExceptionTranslationFilter@408d1364, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@638afb02] [16/08/16 10:41:57:057 IDT] INFO http.DefaultFilterChainValidator: Checking whether login URL '/login' is accessible with your configuration [16/08/16 10:41:57:057 IDT] INFO startup.StartupDbDataInit: ------------------------------------------------------- [16/08/16 10:41:57:057 IDT] INFO startup.StartupDbDataInit: StartupDbDataInit Working - Starting... [16/08/16 10:41:57:057 IDT] INFO startup.StartupDbDataInit: ------------------------------------------------------- [16/08/16 10:41:57:057 IDT] DEBUG internal.TransactionImpl: begin [16/08/16 10:41:57:057 IDT] DEBUG internal.TransactionImpl: rolling back [16/08/16 10:41:57:057 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction [16/08/16 10:41:57:057 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction [16/08/16 10:41:57:057 IDT] INFO startup.StartupDbDataInit: StartupDbDataInit Failed!!!!!, Details=>>> Could not open JPA EntityManager for transaction; nested exception is java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Lorg/hibernate/FlushMode; [16/08/16 10:41:57:057 IDT] WARN support.XmlWebApplicationContext: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'startupDbDataInit': Invocation of init method failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Lorg/hibernate/FlushMode; [16/08/16 10:41:57:057 IDT] INFO jpa.LocalContainerEntityManagerFactoryBean: Closing JPA EntityManagerFactory for persistence unit 'default' [16/08/16 10:41:57:057 IDT] DEBUG internal.SessionFactoryImpl: HHH000031: Closing [16/08/16 10:41:57:057 IDT] DEBUG spi.CascadeStyles: External cascade style regsitration [persist : STYLE_PERSIST] overrode base registration [STYLE_PERSIST_SKIPLAZY] [16/08/16 10:41:57:057 IDT] DEBUG internal.AbstractServiceRegistryImpl: Implicitly destroying ServiceRegistry on de-registration of all child ServiceRegistries [16/08/16 10:41:57:057 IDT] DEBUG internal.BootstrapServiceRegistryImpl: Implicitly destroying Boot-strap registry on de-registration of all child ServiceRegistries [16/08/16 10:41:57:057 IDT] ERROR context.ContextLoader: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'startupDbDataInit': Invocation of init method failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Lorg/hibernate/FlushMode; at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:775) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4842) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5303) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3858) at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:291) at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5660) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1376) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1380) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1380) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1348) at java.lang.Thread.run(Unknown Source) Caused by: org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Lorg/hibernate/FlushMode; at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:427) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:276) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) at com.sun.proxy.$Proxy83.count(Unknown Source) at com.test.startup.StartupDbDataInit.onApplicationInit(StartupDbDataInit.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:365) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:310) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133) ... 25 more Caused by: java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Lorg/hibernate/FlushMode; at org.springframework.orm.jpa.vendor.HibernateJpaDialect.prepareFlushMode(HibernateJpaDialect.java:187) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:173) at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380) ... 46 more 

相关性:树

 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Monitor 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [WARNING] The artifact aspectj:aspectjrt:jar:1.5.4 has been relocated to org.aspectj:aspectjrt:jar:1.5.4 [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Monitor --- [WARNING] The artifact aspectj:aspectjrt:jar:1.5.4 has been relocated to org.aspectj:aspectjrt:jar:1.5.4 [INFO] Monitor:Monitor:war:0.0.1-SNAPSHOT [INFO] +- org.springframework:spring-context:jar:4.3.0.RELEASE:compile [INFO] | +- org.springframework:spring-aop:jar:4.3.0.RELEASE:compile [INFO] | +- org.springframework:spring-beans:jar:4.3.0.RELEASE:compile [INFO] | +- org.springframework:spring-core:jar:4.3.0.RELEASE:compile [INFO] | \- org.springframework:spring-expression:jar:4.3.0.RELEASE:compile [INFO] +- org.springframework:spring-webmvc:jar:4.3.0.RELEASE:compile [INFO] +- org.springframework:spring-tx:jar:4.3.0.RELEASE:compile [INFO] +- org.springframework:spring-web:jar:4.3.0.RELEASE:compile [INFO] +- org.springframework.data:spring-data-jpa:jar:1.10.2.RELEASE:compile [INFO] | +- org.springframework.data:spring-data-commons:jar:1.12.2.RELEASE:compile [INFO] | \- org.springframework:spring-orm:jar:4.2.6.RELEASE:compile [INFO] | \- org.springframework:spring-jdbc:jar:4.2.6.RELEASE:compile [INFO] +- org.springframework.security:spring-security-config:jar:4.1.0.RELEASE:compile [INFO] | +- aopalliance:aopalliance:jar:1.0:compile [INFO] | \- org.springframework.security:spring-security-core:jar:4.1.0.RELEASE:compile [INFO] +- org.springframework.security:spring-security-web:jar:4.1.0.RELEASE:compile [INFO] +- org.hibernate:hibernate-entitymanager:jar:5.2.2.Final:compile [INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile [INFO] | +- dom4j:dom4j:jar:1.6.1:compile [INFO] | +- org.hibernate.common:hibernate-commons-annotations:jar:5.0.1.Final:compile [INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile [INFO] | +- org.javassist:javassist:jar:3.20.0-GA:compile [INFO] | \- org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1:compile [INFO] +- org.hibernate:hibernate-core:jar:5.2.2.Final:compile [INFO] | +- antlr:antlr:jar:2.7.7:compile [INFO] | +- org.jboss:jandex:jar:2.0.0.Final:compile [INFO] | +- com.fasterxml:classmate:jar:1.3.0:compile [INFO] | \- javax.enterprise:cdi-api:jar:1.1:compile [INFO] | +- javax.el:el-api:jar:2.2:compile [INFO] | +- org.jboss.spec.javax.interceptor:jboss-interceptors-api_1.1_spec:jar:1.0.0.Beta1:compile [INFO] | +- javax.annotation:jsr250-api:jar:1.0:compile [INFO] | \- javax.inject:javax.inject:jar:1:compile [INFO] +- org.hibernate:hibernate-validator:jar:5.3.0.Alpha1:compile [INFO] | \- javax.validation:validation-api:jar:1.1.0.Final:compile [INFO] +- org.aspectj:aspectjrt:jar:1.5.4:compile [INFO] +- org.slf4j:slf4j-api:jar:1.7.21:compile [INFO] +- org.slf4j:jcl-over-slf4j:jar:1.7.21:runtime [INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.21:runtime [INFO] +- log4j:log4j:jar:1.2.17:runtime [INFO] +- commons-dbcp:commons-dbcp:jar:1.4:compile [INFO] | \- commons-pool:commons-pool:jar:1.5.4:compile [INFO] +- javax.transaction:jta:jar:1.1:compile [INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided [INFO] +- javax.servlet.jsp:jsp-api:jar:2.2:compile [INFO] +- javax.servlet:jstl:jar:1.2:compile [INFO] +- org.jsoup:jsoup:jar:1.7.2:compile [INFO] +- javax.mail:mail:jar:1.4.7:compile [INFO] | \- javax.activation:activation:jar:1.1:compile [INFO] \- javax.mail:javax.mail-api:jar:1.5.5:compile [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.467 s [INFO] Finished at: 2016-08-16T12:18:23+03:00 [INFO] Final Memory: 13M/245M [INFO] ------------------------------------------------------------------------ 

模块hibernate-entitymanager在Hibernate 5.2.0中被删除,function被移到了hibernate-core 。 所以你可以删除hibernate-entitymanager依赖项(当你使用它时,使用最新版本5.2.2):

  org.hibernate hibernate-core 5.2.2.Final  

如果之后仍然有相同的错误,可能是,另一个依赖关系仍然依赖于旧版本的hibernate-entitymanager ,这会导致冲突。 在这种情况下,再次使用最新版本添加hibernate-entitymanager:

  org.hibernate hibernate-entitymanager 5.2.2.Final  

此外,由于spring-data-jpa 1.10.2依赖于spring-orm 4.2.6,你应该使用正确的版本向spring-orm添加显式依赖:

  org.springframework spring-orm 4.3.0.RELEASE  

您使用不兼容的库。 hibernate5中的API发生了变化:

FlushModeType getFlushMode()

对于Hibernate本机API的用户,我们不得不重命名Hibernate历史上定义的这个方法,因为JPA契约定义了一个相同名称的方法,但是返回了JPA FlushModeType而不是Hibernate的FlushMode。

以下组合对我来说很好:

  5.1.30 5.2.2.Final 4.3.3.RELEASE 1.10.3.RELEASE   mysql mysql-connector-java ${project.mysql.connector.version}   org.hibernate hibernate-entitymanager ${project.hibernate.version}   org.springframework.data spring-data-jpa ${project.spring.data.jpa.version}   org.springframework spring-orm ${project.spring.orm.version}  

但是,在使用MULTI-TENANCY(当前为SCHEMA配置)时,它无法在尝试插入数据之前创建表并抛出表不存在的exception。 我真的不想使用sql导入,因为它消除了自动模式管理的所有好处。

这看起来像是一个Jar冲突。 我正在使用Spring Framework 4.3.5.RELEASE版本,我将hibernate降级为hibernate-core-5.1.0.Final 。 这个对我有用。