尝试启动应用程序时出现NoSuchMethodError Table.indexes()hibernate-core-5.2.13.Final.jar吗?

时间:2018-12-11 15:02:55

标签: spring jpa websphere

有srping + jpa应用程序。 Web服务器是Websphere 8.5.13 因此,我使用添加了配置的WebApplicationInitializer启动了应用程序。

添加PersisnteceConfig时出现问题:

import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
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;

import javax.annotation.Resource;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
@EnableJpaAuditing
@EnableJpaRepositories(basePackages = {"persistence"})
@PropertySource("classpath:application.properties")
@ComponentScan(basePackages = {"persistence"})
public class PersistenceConfig {
    private static final String PROP_DATABASE_DRIVER = "db.driver";
    private static final String PROP_DATABASE_URL = "db.url";
    private static final String PROP_DATABASE_USERNAME = "db.username";
    private static final String PROP_DATABASE_PASSWORD = "db.password";
    private static final String PROP_HIBERNATE_DIALECT = "db.hibernate.dialect";
    private static final String PROP_HIBERNATE_SHOW_SQL = "db.hibernate.show_sql";
    private static final String PACKAGE_WITH_JPA_ENTITIES = "ru.sbrf.risks.services.data.persistence";
    private static final String PROP_HIBERNATE_HBM2DDL_AUTO = "db.hibernate.hbm2ddl.auto";
    private static final String DO_NOT_AUDIT_LOCKING_FIELD = "org.hibernate.envers.do_not_audit_optimistic_locking_field";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getRequiredProperty(PROP_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROP_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROP_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROP_DATABASE_PASSWORD));
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        System.out.println("1");
        LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
        System.out.println("2");
        entityManager.setDataSource(dataSource());
        System.out.println("3");
        entityManager.setPackagesToScan(PACKAGE_WITH_JPA_ENTITIES);
        System.out.println("4");
        entityManager.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        System.out.println("5");
        entityManager.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        System.out.println("6");
        entityManager.setJpaProperties(getHibernateProperties());
        System.out.println("7");
        return entityManager;
    }

    @Bean
    public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }

    //Set properties hibernate
    private Properties getHibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", env.getRequiredProperty(PROP_HIBERNATE_DIALECT));
        properties.put("hibernate.show_sql", env.getRequiredProperty(PROP_HIBERNATE_SHOW_SQL));
        properties.put("hibernate.hbm2ddl.auto", env.getRequiredProperty(PROP_HIBERNATE_HBM2DDL_AUTO));
        properties.put("org.hibernate.envers.do_not_audit_optimistic_locking_field",
                env.getRequiredProperty(DO_NOT_AUDIT_LOCKING_FIELD));

        properties.put("verifyServerCertificate", false);
        properties.put("useSSL", false);
        properties.put("requireSSL", false);
        properties.put("useLegacyDatetimeCode", false);
        properties.put("useUnicode", "yes");
        properties.put("characterEncoding", "UTF-8");
        properties.put("serverTimezone", "UTC");
        properties.put("useJDBCCompliantTimezoneShift", true);
        return properties;
    }
}

因此,我使用hibernate-core-5.2.13.Final libriary,并尝试在WebSphere 8.5.13上启动应用程序时,出现错误消息:

  

调用init方法失败;嵌套异常为   java.lang.NoSuchMethodError:   javax / persistence / Table.indexes()[Ljavax / persistence / Index; (已加载   从   文件:/opt/IBM/WebSphere/AppServer/plugins/javax.j2ee.persistence.jar   通过org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@ec08ccb6)   从类org.hibernate.cfg.annotations.EntityBinder调用(已加载   从   文件:/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/MyApp_war.ear/MyApp.war/WEB-INF/lib/hibernate-core-5.2.13.Final.jar   通过   com.ibm.ws.classloader.CompoundClassLoader@7f080f2e [war:MyApp_war / MyApp.war]

1 个答案:

答案 0 :(得分:2)

您正尝试使用实现与WebSphere 8.5.5中包含的JPA 2.0不同的规范版本的Hibernate版本。可以做到,但是您还需要带上自己的JPA API版本。为此,您需要将您的Web模块的类加载器切换为“ Parent Last”,或者将Hibernate和JPA API jar移至共享库,然后将该库配置为使用隔离的类加载器(有效地设置“最后的父母”仅用于库中的罐子。