user5620472
user5620472

Reputation: 2882

Spring 4 + Spring repositories + hibernate 5: Error create java config

I have spring 4 app and I want use spring repositories. I tried include spring jpa_hibernate

compile 'org.springframework.data:spring-data-jpa:1.11.4.RELEASE'
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.0.5.Final'

and create config like oficial spring doc:

@Configuration
@ComponentScan("my.domain")
@EnableJpaRepositories("my.domain")
@EnableTransactionManagement
public class ApplicationConfiguration {

    @Bean
    public Config getConfig() {
        return ConfigLoader.load();
    }

    @Bean
    @Autowired
    public DataSource getDatasource(Config config) throws Exception {
        Properties props = new Properties();
        Config dbConfig = config.getConfig("db.config");
        dbConfig.entrySet().forEach(entry -> props.put(entry.getKey(), entry.getValue().unwrapped()));
        return new DataSourceFactory().createDataSource(props);
    }

    @Bean
    @Autowired
    public NamedParameterJdbcTemplate getJdbcTemplate(DataSource datasource) {
        return new NamedParameterJdbcTemplate(datasource);
    }

    @Bean
    @Autowired
    public PlatformTransactionManager getTransactionManager(DataSource datasource) {
        return new DataSourceTransactionManager(datasource);
    }

    @Bean
    @Autowired
    public EntityManagerFactory entityManagerFactory(DataSource datasource) {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setDataSource(datasource);
        factory.afterPropertiesSet();
        return factory.getObject();
    }

    @Bean
    @Autowired
    public PlatformTransactionManager transactionManager(DataSource datasource) {

        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory(datasource));
        return txManager;
    }
}

But I get error when tried run app:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in my.ApplicationConfiguration: 
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.IllegalStateException: 
Failed to determine Hibernate PersistenceProvider

I used repositories in springboot and Configure in file, But I not found worck actual example for java config spring(not boot only simple core app)

Upvotes: 0

Views: 865

Answers (1)

ledniov
ledniov

Reputation: 2382

As you are using latest Spring Data release, upgrade to the latest Hibernate release:

compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.10.Final'

Spring requires hibernate's EntityManagerFactory implementation which previosly was provisioned by separate jar which is now deprecated, so you need only single hibernate-core dependency.

Also consider using following configuration:

@Configuration
@ComponentScan("my.domain")
@EnableJpaRepositories("my.domain")
@EnableTransactionManagement
public class ApplicationConfiguration {

    @Bean
    public Config getConfig() {
        return ConfigLoader.load();
    }

    @Bean
    public DataSource getDatasource(Config config) throws Exception {
        Properties props = new Properties();
        Config dbConfig = config.getConfig("db.config");
        dbConfig.entrySet().forEach(entry -> props.put(entry.getKey(), entry.getValue().unwrapped()));
        return new DataSourceFactory().createDataSource(props);
    }

    @Bean
    public NamedParameterJdbcTemplate getJdbcTemplate(DataSource datasource) {
        return new NamedParameterJdbcTemplate(datasource);
    }

    @Bean
    @Autowired
    public PlatformTransactionManager getTransactionManager(DataSource datasource) {
        return new DataSourceTransactionManager(datasource);
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setDataSource(dataSource());
        factory.setPackagesToScan("my.domain");

        return factory;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory);

        return txManager;
    }

}

You were referencsing old spring data documentation, current version is available here.

Upvotes: 1

Related Questions