복붙노트

[SPRING] Hibernate core 5.2.1 로의 마이그레이션 java.lang.NoSuchMethodError : org.hibernate.Session.getFlushMode () Lorg / hibernate / FlushMode;

SPRING

Hibernate core 5.2.1 로의 마이그레이션 java.lang.NoSuchMethodError : org.hibernate.Session.getFlushMode () Lorg / hibernate / FlushMode;

봄 버전 사용 : 4.3.1, 봄 데이터 : 1.10.2, 최대 절전 모드 코어 : 5.2.1. postgres 사용하기 데이터베이스 pg 커넥터 버전 : 9.4.1208.jre7 Hibernate 5.1.0에서 5.2.1로 업그레이드 한 후에 예외 아래에있는 엔티티를 만들려고 할 때

    at java.lang.Thread.run(Thread.java:745)
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.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
    at com.cando.person.controller.UserController$$EnhancerBySpringCGLIB$$250a315a.createDefaultUser(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    ... 31 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)
    ... 51 more

자바 설정

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories( "com.cando.**.repository" )
@PropertySource( "classpath:spring.properties" )
public class SpringDataConfig
{
    @Autowired
    private Environment env;

    // Declare a datasource
    @Bean
    public DataSource dataSource()
    {
        try
        {
            boolean productionProfile = checkProfileIsActive( IConstants.PROFILE_PRODUCTION );
            String driverClassName = productionProfile ? env.getRequiredProperty( "production.app.jdbc.driverClassName" ) : env.getRequiredProperty( "dev.app.jdbc.driverClassName" );
            String url = productionProfile ? env.getRequiredProperty( "production.app.jdbc.url" ) : env.getRequiredProperty( "dev.app.jdbc.url" );
            String username = productionProfile ? env.getRequiredProperty( "production.app.jdbc.username" ) : env.getRequiredProperty( "dev.app.jdbc.username" );
            String password = productionProfile ? env.getRequiredProperty( "production.app.jdbc.password" ) : env.getRequiredProperty( "dev.app.jdbc.password" );

            System.out.println( driverClassName + " " + url + " " + username + " " + password );

            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName( driverClassName );
            dataSource.setUrl( url);
            dataSource.setUsername( username );
            dataSource.setPassword( password );
            return dataSource;
        }
        catch ( Exception e )
        {
            throw new RuntimeException( e );
        }
    }

    // Declare a JPA entityManagerFactory
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory()
    {

        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource( dataSource() );
        entityManagerFactoryBean.setPackagesToScan( "com.cando.**.model" );


        Properties properties = new Properties();
        properties.put( "hibernate.dialect", "org.hibernate.dialect.PostgreSQL95Dialect" );
        properties.put( "hibernate.show_sql", false );
        properties.put( "hibernate.format_sql", false );
        //properties.put( "hibernate.hbm2ddl.auto", "update" );
        properties.put( "hibernate.hbm2ddl.auto", "create-drop" );


        entityManagerFactoryBean.setJpaProperties( properties );

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl( Boolean.TRUE );
        vendorAdapter.setShowSql( Boolean.TRUE );

        entityManagerFactoryBean.setJpaVendorAdapter( vendorAdapter );

        return entityManagerFactoryBean;
    }

    // Declare a transaction manager
    @Bean
    public JpaTransactionManager transactionManager()
    {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory( entityManagerFactory().getObject() );
        return transactionManager;
    }

    private boolean checkProfileIsActive( String profileName )
    {
        for ( String profile : env.getActiveProfiles() )
        {
            if ( StringUtils.equals( profileName, profile ) )
            {
                return true;
            }
        }
        return false;
    }
}

Github 코드 : https://github.com/arun472/spring-data-jpa

해결법

  1. ==============================

    1.이것은 당신이 선택한 Spring Framework 4.3.0.RELEASE 버전에 대한 Jar 충돌로 보인다. 그것을 hibernate-core-5.1.0.Final.jar로 다운 그레이드하십시오.

    이것은 당신이 선택한 Spring Framework 4.3.0.RELEASE 버전에 대한 Jar 충돌로 보인다. 그것을 hibernate-core-5.1.0.Final.jar로 다운 그레이드하십시오.

  2. ==============================

    2.Spring 프레임 워크 4.3.0.RELEASE에서 Hibernate 5.2 API에 대한 메소드 시그니처 지원이 추가되어 이상하게 보입니다. 여기서 특별히 getHibernateFlushMode를 먼저 찾은 다음 getFlushMode를 추적합니다.

    Spring 프레임 워크 4.3.0.RELEASE에서 Hibernate 5.2 API에 대한 메소드 시그니처 지원이 추가되어 이상하게 보입니다. 여기서 특별히 getHibernateFlushMode를 먼저 찾은 다음 getFlushMode를 추적합니다.

    아마도 클래스 패스에 새로운 Hibernate 라이브러리가있을 가능성은 있지만, 호환되지 않는 클래스 패스에 이전 버전의 Spring Framework가있을 가능성이 있습니다.

  3. ==============================

    3.그 방법을 구현하는 ConfigurationHelper 클래스를 발견했다.     공공 정적 getFlushMode (객체 값)  org.hibernate.jpa.internal.util 패키지의 hibernate-entitymanager-5.0.2.Final.jar에서 hibernate-core-5.2.12.Final.jar에 구현 된 디폴트 값을 포함하는 올바른 메소드 시그니처와 충돌한다. 잘못된 구현이 해결되었습니다. 이미 종속성 hibernate-core-5.2.12.Final.jar를 포함하고있는 내 gradle.build 파일에서 종속성 hibernate-entitymanager-5.0.2.Final.jar를 제거하고 메소드가 예외를 찾지 못했습니다.

    그 방법을 구현하는 ConfigurationHelper 클래스를 발견했다.     공공 정적 getFlushMode (객체 값)  org.hibernate.jpa.internal.util 패키지의 hibernate-entitymanager-5.0.2.Final.jar에서 hibernate-core-5.2.12.Final.jar에 구현 된 디폴트 값을 포함하는 올바른 메소드 시그니처와 충돌한다. 잘못된 구현이 해결되었습니다. 이미 종속성 hibernate-core-5.2.12.Final.jar를 포함하고있는 내 gradle.build 파일에서 종속성 hibernate-entitymanager-5.0.2.Final.jar를 제거하고 메소드가 예외를 찾지 못했습니다.

  4. from https://stackoverflow.com/questions/38417613/migration-to-hibernate-core-5-2-1-ava-lang-nosuchmethoderror-org-hibernate-sess by cc-by-sa and MIT license