Правильная и полная конфигурация для 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.