spring boot 2.x 配置hibernate

  1. 新闻资讯
  2. 技术百科
公司新闻 案例分享 技术百科 行业动态

spring boot 2.x 配置hibernate

来源:奇站网络 浏览量:3052 发布日期: 2020-07-05

1、环境准备

spring boot版本:2.3.1.RELEASE

#

网上搜索spring boot 2.x hibernate配置,很多都是jpa例子
从关系上来说应该是spring data jpa-》hibernate-》jpa,jpa是注解规范,jpa是基于hibernate帮我们实现一些通用的操作。
因为需要把旧的项目(spring mvc + spring + hibernat 3.6.5,前后端分离)升级spring boot 2.x,这里只讨论hibernate的配置,毕竟除了hibernate的部分需要升级,其他的部分大部分都可以通用。

2、sessionFactory

hibernate别的不需要多说,只需要设置sessionFactory就可以了。

spring boot可以直接从EntityManagerFactory获取sessionFactory.

下面是修改SimpleHibernateDao的代码,SimpleHibernateDao是旧项目里的封装了常用方法的基类

  1. @Autowired
  2. private EntityManagerFactory entityManagerFactory;
  3. /**
  4. * 取得sessionFactory.
  5. */
  6. public SessionFactory getSessionFactory() {
  7. return entityManagerFactory.unwrap(SessionFactory.class);
  8. }
  9. /**
  10. * 取得当前Session.
  11. */
  12. protected Session getSession() {
  13. return getSessionFactory().getCurrentSession();
  14. }

获取session的2种方式:
1、getCurrentSession()会自动关闭session,但是要配置current_session_context_class,并且需要使用事务
2、openSession()这种方式需要手动关闭session

3、步骤三

前面配置完,测试报no transaction is in progress错误
解决方法1:代码配置

  1. spring.jpa.database=MYSQL
  2. spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
  3. spring.jpa.show-sql=true
  4. spring.jpa.hibernate.ddl-auto=none
  5. spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
  6. spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
  7. spring.jpa.properties.hibernate.show-sql=true
  8. spring.jpa.properties.hibernate.cache.use_second_level_cache=false
  9. spring.jpa.properties.hibernate.cache.use_query_cache=false
  1. @Configuration
  2. public class HibernateConfig {
  3. @Autowired
  4. private Environment environment;
  5. @Autowired
  6. private DataSource dataSource;
  7. @Bean
  8. public LocalSessionFactoryBean sessionFactoryBean() {
  9. LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
  10. sessionFactoryBean.setDataSource(dataSource);
  11. sessionFactoryBean.setPackagesToScan("com.qizhan100");//dao和entity的公共包
  12. sessionFactoryBean.setHibernateProperties(hibernateProperties());
  13. return sessionFactoryBean;
  14. }
  15. //获取hibernate配置
  16. private Properties hibernateProperties() {
  17. Properties properties = new Properties();
  18. properties.setProperty("hibernate.current_session_context_class", environment.getProperty("spring.jpa.properties.hibernate.current_session_context_class"));
  19. properties.setProperty("hibernate.hbm2ddl.auto", environment.getProperty("spring.jpa.hibernate.ddl-auto"));
  20. properties.setProperty("hibernate.show-sql", environment.getProperty("spring.jpa.properties.hibernate.show-sql"));
  21. properties.setProperty("hibernate.cache.use_second_level_cache", environment.getProperty("spring.jpa.properties.hibernate.cache.use_second_level_cache"));
  22. properties.setProperty("hibernate.cache.use_query_cache", environment.getProperty("spring.jpa.properties.hibernate.cache.use_query_cache"));
  23. return properties;
  24. }
  25. }

解决方法2:降低hibernate版本

  1. <properties>
  2. <java.version>1.8</java.version>
  3. <hibernate.version>5.0.12.Final</hibernate.version>
  4. </properties>
  5. <dependency>
  6. <groupId>org.hibernate</groupId>
  7. <artifactId>hibernate-core</artifactId>
  8. <version>${hibernate.version}</version>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.hibernate</groupId>
  12. <artifactId>hibernate-entitymanager</artifactId>
  13. <version>${hibernate.version}</version>
  14. </dependency>
  15. `

getCurrentSession导致的问题

问题1:org.hibernate.HibernateException: No CurrentSessionContext configured!

application.properties

  1. spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
问题2:Could not obtain transaction-synchronized Session for current thread

这个问题就是因为session是用getCurrentSession()获取,但是方法上没有开启事务导致。

consider declaring the factory method as static for independence from its containing instance
待查

参考资料
https://www.jianshu.com/p/57e3c9a40709
https://blog.csdn.net/qq_15329947/article/details/85232287
https://blog.csdn.net/xiaonannew/article/details/82634241
https://blog.csdn.net/wt592376761/article/details/104797009

上一篇 jenkins

厦门奇站网络科技有限公司

电话:13313868605

QQ:3413772931

地址:厦门集美区软件园三期

网站地图


                    扫一扫加我咨询