2016-12-22 307 views
2

我有一個Spring引導1.4.2應用程序與Hibernate 5.2.2和Spring數據Envers 1.0.5。未經審計的實體保持良好狀態。使用@Audited註釋實體會導致事務回滾,並帶有以下堆棧跟蹤。有任何想法嗎?spring-data-envers Hibernate java.lang.NoSuchMethodError:org.hibernate.engine.spi.SessionImplementor.getTransactionCoordinator

> 2016-12-22 18:15:08,364 ERROR | http-nio-8080-exec-1 | 
> org.springframework.orm.jpa.JpaTransactionManager  | Commit 
> exception overridden by rollback exception 
> java.lang.NoSuchMethodError: 
> org.hibernate.engine.spi.SessionImplementor.getTransactionCoordinator()Lorg/hibernate/resource/transaction/TransactionCoordinator; 
> at 
> org.hibernate.envers.internal.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:131) 
> at 
> org.hibernate.envers.internal.synchronization.AuditProcessManager$1.doBeforeTransactionCompletion(AuditProcessManager.java:46) 
> at 
> org.hibernate.engine.spi.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:928) 
> at 
> org.hibernate.engine.spi.ActionQueue.beforeTransactionCompletion(ActionQueue.java:503) 
> at 
> org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2383) 
> at 
> org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:467) 
> at 
> org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:146) 
> at 
> org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) 
> at 
> org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:220) 
> at 
> org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:68) 
> at 
> org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) 
> at 
> org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761) 
> at 
> org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730) 
> at 
> org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504) 
> at 
> org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292) 
> 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.$Proxy173.save(Unknown Source) ... 

應用配置類

@Configuration 
@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class) 
@EnableTransactionManagement 
public class ApplicationConfig {} 

實體類

@Entity(name = "foo") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "sub_type", discriminatorType = DiscriminatorType.INTEGER) 
@Table(name = "foo") 
@SecondaryTable(
     name = "bar", 
     pkJoinColumns = @PrimaryKeyJoinColumn(name = "foo_id")) 
@Audited 
public class FooEntity {} 

從gradle這個build文件的有關片段

buildscript { 
    ext { 
     springBootVersion = "1.4.2.RELEASE" 
     verifier_version = "1.0.0.RELEASE" 
    } 
    repositories { 
     maven {url "https://plugins.gradle.org/m2/"} 
     maven {url "http://repo.spring.io/plugins-release"} 
     jcenter() 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.build.gradle:propdeps-plugin:0.0.7") 
     classpath("io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE") 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
     classpath("se.transmode.gradle:gradle-docker:1.2") 
     classpath("com.commercehub:gradle-cucumber-jvm-plugin:0.7") 
     classpath("org.ajoberstar:grgit:1.1.0") 
     classpath("org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.1-rc3") 
     classpath("gradle.plugin.org.detoeuf:swagger-codegen-plugin:1.6.3") 
     classpath("org.springframework.cloud:spring-cloud-contract-gradle-plugin:${verifier_version}") 
     classpath "net.linguica.gradle:maven-settings-plugin:0.5" 
    } 
} 
... 
dependencyManagement { 
    imports { 
     mavenBom "org.springframework.cloud:spring-cloud-dependencies:Brixton.SR7" 
     mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${verifier_version}" 
     mavenBom 'org.springframework.cloud:spring-cloud-stream-dependencies:Brooklyn.SR1' 
    } 
} 
... 
    compile(
       "org.springframework.boot:spring-boot-starter-data-jpa", 
       'org.springframework.data:spring-data-commons', 
       'org.springframework.cloud:spring-cloud-starter-config', 
       'org.springframework.cloud:spring-cloud-starter-eureka', 
       'org.springframework.cloud:spring-cloud-starter-sleuth', 
       'org.springframework.cloud:spring-cloud-sleuth-zipkin', 
       'com.netflix.hystrix:hystrix-javanica', 
       'org.springframework.boot:spring-boot-starter-aop', 
       "org.springframework.boot:spring-boot-starter-web", 
       "io.swagger:swagger-annotations:1.5.9", 
       "com.google.code.gson:gson:2.7", 
       "gradle.plugin.org.detoeuf:swagger-codegen-plugin:1.6.3", 
       "org.springframework:spring-orm", 
       "com.oracle.jdbc:ojdbc7:12.1.0.2", 
       'org.springframework.cloud:spring-cloud-stream', 
       'org.springframework.cloud:spring-cloud-stream-test-support', 
       'org.springframework.cloud:spring-cloud-stream-binder-test', 
       "org.springframework.boot:spring-boot-starter-hateoas", 
       "com.fasterxml.jackson.module:jackson-module-parameter-names", 
       "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", 
       "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.6.1", 
       "org.hibernate:hibernate-core:5.2.2.Final", 
       "org.springframework.data:spring-data-envers:1.0.5.RELEASE" 
     ) 

回答

3

它看起來像你指定的休眠版本5.2.2.Final,但我沒有看到覆蓋Envers的默認版本的位置,因此Spring模塊可能會爲Envers導入4.3.11.Final,從而產生您看到的衝突。

確保hibernate-corehibernate-envers引用相同的版本。

+0

謝謝@Naros,就是這樣。我不敢相信我沒有看到它 – golfradio

+0

很容易忽略:)。很高興它解決了這個問題。 – Naros