Правильная и полная конфигурация для Spring Boot 1.5.x для Hibernate 5

Около Spring Boot для 1.5.10.RELEASE версия. Он работает внутри с Hibernate для версии 5.0.12.Final

С целью избежать появления следующего сообщения об ошибке:

required a bean of type 'org.hibernate.SessionFactory' that could not be found

HibernateJpaSessionFactoryBean класс должен быть применен. Это в соответствии с:

Ситуация здесь HibernateJpaSessionFactoryBean класс @Deprecated,

Решение, предложенное в соответствии с Javadoc HibernateJpaSessionFactoryBean, заключается в обходеEntityManagerFactory#unwrap

Таким образом из:

вручную должно быть объявлено следующее:

@Bean
public SessionFactory sessionFactory(EntityManagerFactory emf) {
    return emf.unwrap(SessionFactory.class);
}

Предупреждение обязательно включить вapplication.propertiesподайте следующее (это не упомянуто в посте выше):

spring.jpa.properties.hibernate.current_session_context_class = 
org.springframework.orm.hibernate5.SpringSessionContext

В противном случае появляется:

org.springframework.orm.jpa.JpaSystemException:
No CurrentSessionContext configured!; nested exception is org.hibernate.HibernateException:
No CurrentSessionContext configured!

Пока здесь мой @Test классы, работающие через Hibernateне получается, эти же @Test занятия проходят в другом проработанном проекте Spring FrameworkТаким образом, вся инфраструктура дляHibernateобъявлено вручную.

Поэтому через следующий код:

@Test
public void contextLoads() {

    String[] beanNames = applicationContext.getBeanDefinitionNames();
    Arrays.sort(beanNames);
    for (String beanName : beanNames) {
        logger.info("beanName: {}", beanName);
    }

    logger.info("PlatformTransactionManager");
    if(transactionManager != null) {
        logger.info("Class: {}", transactionManager.getClass().getName());
    }

}

всеbeansсозданоSpring Bootнапечатаны, и я подтвердил следующее:

 - PlatformTransactionManager 
 - Class: org.springframework.orm.jpa.JpaTransactionManager

Я ожидалHibernateTransactionManagerвместоJpaTransactionManager,

Мой уникальный способ получить@Test Передача методов объявляется вручную другим@Bean:

@Bean
public PlatformTransactionManager transactionManager(SessionFactory sessionFactory){
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory);
    return transactionManager;
}

Следовательно:

  • Какая правильная и полная конфигурация дляSpring Boot 1.5.xзаHibernate 5?

Наблюдение: еще лучше, если все полностью настроено черезapplication.properties файл (цель избежать объявлять вручную любой@Bean)

Как резюме, уникальный способ интеграцииSpring Boot дляравниныHibernate (Рассмотрим сценарий для переноса всего проекта, работающего через Spring Framework в Spring Boot работая как с Hibernate) через следующее:

spring.jpa.hibernate.ddl-auto = none

spring.jpa.properties.hibernate.cache.provider_class = org.hibernate.cache.NoCacheProvider
spring.jpa.properties.hibernate.current_session_context_class = org.springframework.orm.hibernate5.SpringSessionContext
spring.jpa.properties.hibernate.default_batch_fetch_size = 30
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.format_sql = true
spring.jpa.properties.hibernate.jdbc.batch_size = 30
spring.jpa.properties.hibernate.max_fetch_depth = 30
spring.jpa.properties.hibernate.order_updates = true;
spring.jpa.properties.hibernate.show_sql = false
spring.jpa.properties.hibernate.use_sql_comments = true

Плюс эти два мандатария @Beans

@Bean
public SessionFactory sessionFactory(EntityManagerFactory emf) {
    return emf.unwrap(SessionFactory.class);
}

@Bean
public PlatformTransactionManager transactionManager(SessionFactory sessionFactory){
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory);
    return transactionManager;
}

Без этих двух @Beans У меня есть все две ошибки, о которых уже сообщалось.

Поэтому цель - настроить Hibernate только через application.properties

1 ответ

Это предложение (Spring Boot 1.5.10.RELEASE)

Файл application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/vy
spring.datasource.username=root
spring.datasource.password=123456
# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle=true
spring.datasource.validationQuery=SELECT 1
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

Файл BeanConfig.java

package com.example;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManagerFactory;

@Configuration
public class BeanConfig {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Bean
    public SessionFactory getSessionFactory() {
        if (entityManagerFactory.unwrap(SessionFactory.class) == null) {
            throw new NullPointerException("factory is not a hibernate factory");
        }
        return entityManagerFactory.unwrap(SessionFactory.class);
    }

}

Файл UserDao.java

package com.example.dao;

import com.example.model.UserDetails;

import java.util.List;

public interface UserDao {

    List<UserDetails> getUserDetails();

}

Файл UserDaoImpl.java, где используется SessionFactory

package com.example.dao.impl;

import com.example.dao.UserDao;
import com.example.model.UserDetails;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class UserDaoImpl implements UserDao {

    @Autowired
    private SessionFactory sessionFactory;

    public List<UserDetails> getUserDetails() {
        Criteria criteria = sessionFactory.openSession().createCriteria(UserDetails.class);
        return criteria.list();
    }

}

цель - настроить Hibernate только через application.properties

-> Это нормально с реализацией JPA с использованием Hibernate Session. Spring Data JPA тесно интегрирован с Spring Boot (по крайней мере, я проверял это с SpringBoot 2.0.0.RC1). Конфигурация через application.propertiesПод капотом Spring Boot производится автоконфигурация.

Это не в порядке с полными функциями Hibernate ORM.

Другие вопросы по тегам