简体   繁体   中英

Hibernate AbstractMethodError

I am using the latest version of spring, hibernate and spring data jpa on a gradle project but I get an AbstractMethodError exception. here is part of the stack trace

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'EntityManagerFactory' defined in class path resource [com/ashken/config/JPADataConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.persistence.EntityManagerFactory]: Factory method 'entityManagerFactory' threw exception; nested exception is java.lang.AbstractMethodError
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[na:na]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) ~[na:na]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) ~[na:na]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[na:na]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[na:na]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[na:na]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[na:na]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[na:na]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[na:na]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) ~[na:na]
    ... 93 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.persistence.EntityManagerFactory]: Factory method 'entityManagerFactory' threw exception; nested exception is java.lang.AbstractMethodError
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[na:na]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[na:na]
    ... 102 common frames omitted
Caused by: java.lang.AbstractMethodError: null
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:278) ~[na:na]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[na:na]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:802) ~[na:na]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[na:na]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) ~[na:na]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:319) ~[na:na]
    at com.ashken.config.JPADataConfig.entityManagerFactory(JPADataConfig.java:56) ~[na:na]
    at com.ashken.config.JPADataConfig$$EnhancerBySpringCGLIB$$a3ded6c2.CGLIB$entityManagerFactory$1(<generated>) ~[na:na]
    at com.ashken.config.JPADataConfig$$EnhancerBySpringCGLIB$$a3ded6c2$$FastClassBySpringCGLIB$$91e60d8f.invoke(<generated>) ~[na:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[na:na]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:355) ~[na:na]
    at com.ashken.config.JPADataConfig$$EnhancerBySpringCGLIB$$a3ded6c2.entityManagerFactory(<generated>) ~[na:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0]
    at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[na:na]

this is the gradle file

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'org.akhikhl.gretty'
apply plugin: "war"
war {
    baseName = 'Test'
    version = '1.0'
}

//sourceCompatibility = 1.7

repositories {
    mavenLocal()
    mavenCentral()
     maven { url "http://repository.pentaho.org/artifactory/repo/" }
    maven { url "https://repo.spring.io/libs-release" }
}

dependencies {
  // Dependencies goes here

  compile 'javax.servlet:javax.servlet-api:3.1.0'
  compile 'org.springframework:spring-webmvc:4.2.5.RELEASE'
  compile 'org.springframework:spring-context-support:4.2.5.RELEASE'
  compile 'org.springframework:spring-orm:4.2.5.RELEASE'
  compile 'org.springframework:spring-jdbc:4.2.5.RELEASE'
  compile 'org.springframework:spring-tx:4.2.5.RELEASE'
  compile 'org.springframework:spring-aop:4.2.5.RELEASE'

  compile 'org.springframework.security:spring-security-core:4.0.4.RELEASE'
  compile 'org.springframework.security:spring-security-web:4.0.4.RELEASE'
  compile 'org.springframework.security:spring-security-config:4.0.4.RELEASE'
  compile 'org.springframework.security.oauth:spring-security-oauth2:2.0.8.RELEASE'

  compile 'org.springframework.data:spring-data-jpa:1.9.4.RELEASE'
  compile 'org.springframework.data:spring-data-mongodb:1.8.2.RELEASE'
  compile 'org.springframework.data:spring-data-envers:0.3.0.RELEASE'

  compile 'javax.servlet:jstl:1.2'
  compile 'org.hibernate:hibernate-core:5.1.0.Final'
  compile 'org.hibernate:hibernate-entitymanager:5.1.0.Final'
  compile 'org.hibernate:hibernate-validator:5.2.4.Final'

  compile 'org.apache.commons:commons-dbcp2:2.1.1'

  compile 'mysql:mysql-connector-java:5.1.38'
  compile 'org.postgresql:postgresql:9.4.1207.jre7'


  compile 'com.fasterxml.jackson.core:jackson-core:2.7.3'
  compile 'com.fasterxml.jackson.core:jackson-databind:2.7.3'
  compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.3'

  compile 'org.apache.poi:poi:3.13'
  compile 'net.sf.jasperreports:jasperreports:6.2.0'

  compile 'org.apache.logging.log4j:log4j-core:2.5'
  compile 'org.apache.logging.log4j:log4j-api:2.5'
  compile 'commons-fileupload:commons-fileupload:1.3.1'
  compile 'commons-io:commons-io:2.4'
  compile 'commons-logging:commons-logging:1.2'

  compile 'com.itextpdf:itextpdf:5.5.8'
  compile 'com.lowagie:itext:2.1.7'
  compile 'org.olap4j:olap4j:1.1.0'

  compile 'org.thymeleaf:thymeleaf-spring4:3.0.0.BETA01'
}

//Gretty Embedded Jetty
buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'org.akhikhl.gretty:gretty:+'
  }
}
gretty {
  port = 8080
  contextPath = '/'
  servletContainer = 'jetty9' //tomcat7 or tomcat8
}

eclipse {

  wtp {
    component {

      //define context path, default to project folder name
      contextPath = '/'

    }

  }
}

and my jpa config class which never gives me problems with an older version of the artifacts

package com.ashken.config;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;



@Configuration
@EnableJpaRepositories(entityManagerFactoryRef="EntityManagerFactory",transactionManagerRef="TransactionManager", basePackages="com.ashken.repositories")
@EnableTransactionManagement
public class JPADataConfig {

    @Autowired 
    Environment environment;

    @Bean(name = "DataSource")
    public DataSource getAuthDataSource()
    {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/ngo");
        ds.setUsername("root");
        ds.setPassword("");
        return ds;
    }

    @Autowired
    @Bean(name="EntityManagerFactory")
    EntityManagerFactory entityManagerFactory(@Qualifier("DataSource") DataSource dataSource) {

        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        entityManagerFactoryBean.setPackagesToScan("com.ashken.entities");

        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        jpaProperties.setProperty("hibernate.hbm2ddl.auto", "update");
        jpaProperties.setProperty("hibernate.connection.autocommit", "false");
        //jpaProperties.setProperty("hibernate.show_sql", "true");
        entityManagerFactoryBean.setJpaProperties(jpaProperties);
        entityManagerFactoryBean.afterPropertiesSet();

        return entityManagerFactoryBean.getObject();
    }


     @Autowired
     @Bean(name = "TransactionManager")
        JpaTransactionManager transactionManager(@Qualifier("EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory);
            return transactionManager;
        }

}

As you probably know, AbstractMethodError sometimes caused by JAR incompability . I tried my self your gradle build, and found things that probably causing this problem by looking at your WAR file:

  1. You use old version of hibernate-envers. You not asking for this but you declare dependency to spring-data-envers (and thus spring-data-envers requires the hibernate-envers JAR), that probably causing the problem.

  2. I see that you have duplicate of bcmail-jdk14-138.jar, bcprov-jdk14-138.jar, and stax-api-1.0.x.jar. Remove one of them maybe resolve your problem.

Edit: Some of those jars come from thing named transitive dependencies , which is very common and natural in both maven and gradle . The conflict coming when different libraries/framework have the same dependencies to another library that have different version .

For example, hibernate and spring will have the same dependency to cglib. But hibernate declare that they depends on cglib-1.2, while spring decided to depends on cglib-1.0. In the end, when you build your WAR (or JAR with its dependencies), your build will bring both cglib-1.0 and cglib-1.2.

how do i get rid of them

You could try to execute:

gradle dependencies

Or with any provided variants , and then exclude duplicate jars with declaring dependencies in your build.gradle like this:

compile ('com.lowagie:itext:2.1.7') {
  exclude group: 'org.bouncycastle', module: 'bcmail-jdk14'
}

If you found that you're not comfortable diff-ing duplicate dependencies using command line, you could try to:

  1. Add apply plugin: "maven" to your build.gradle, and then execute gradle install command.

  2. In <project-root-dir>/build , copy pom-default.xml to <project-root-dir>/pom.xml .

  3. Open this project with eclipse with m2eclipse support (I think all latest eclipse version should support maven).

  4. Open your pom.xml and change the tab to "Dependency Hierarchy" and you could "exclude" dependencies in the right panel. In pom.xml , excluded dependencies will mark with

    <exclusion> .... </exclusion>

  5. Transform excluded libs/jars that already declared in pom.xml to your build.gradle .

Hope that helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM