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是旧项目里的封装了常用方法的基类
@Autowiredprivate EntityManagerFactory entityManagerFactory;/*** 取得sessionFactory.*/public SessionFactory getSessionFactory() {return entityManagerFactory.unwrap(SessionFactory.class);}/*** 取得当前Session.*/protected Session getSession() {return getSessionFactory().getCurrentSession();}
获取session的2种方式:
1、getCurrentSession()会自动关闭session,但是要配置current_session_context_class,并且需要使用事务
2、openSession()这种方式需要手动关闭session
3、步骤三
前面配置完,测试报no transaction is in progress错误
解决方法1:代码配置
spring.jpa.database=MYSQLspring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialectspring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=nonespring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialectspring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContextspring.jpa.properties.hibernate.show-sql=truespring.jpa.properties.hibernate.cache.use_second_level_cache=falsespring.jpa.properties.hibernate.cache.use_query_cache=false
@Configurationpublic class HibernateConfig {@Autowiredprivate Environment environment;@Autowiredprivate DataSource dataSource;@Beanpublic LocalSessionFactoryBean sessionFactoryBean() {LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource);sessionFactoryBean.setPackagesToScan("com.qizhan100");//dao和entity的公共包sessionFactoryBean.setHibernateProperties(hibernateProperties());return sessionFactoryBean;}//获取hibernate配置private Properties hibernateProperties() {Properties properties = new Properties();properties.setProperty("hibernate.current_session_context_class", environment.getProperty("spring.jpa.properties.hibernate.current_session_context_class"));properties.setProperty("hibernate.hbm2ddl.auto", environment.getProperty("spring.jpa.hibernate.ddl-auto"));properties.setProperty("hibernate.show-sql", environment.getProperty("spring.jpa.properties.hibernate.show-sql"));properties.setProperty("hibernate.cache.use_second_level_cache", environment.getProperty("spring.jpa.properties.hibernate.cache.use_second_level_cache"));properties.setProperty("hibernate.cache.use_query_cache", environment.getProperty("spring.jpa.properties.hibernate.cache.use_query_cache"));return properties;}}
解决方法2:降低hibernate版本
<properties><java.version>1.8</java.version><hibernate.version>5.0.12.Final</hibernate.version></properties><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency>`
getCurrentSession导致的问题
问题1:org.hibernate.HibernateException: No CurrentSessionContext configured!
application.properties
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
- 版权所有:奇站网络 转载请注明出处
- 厦门奇站网络科技有限公司,专业提供网站建设,响应式网站建设,小程序开发,系统定制开发。
- 软件开发咨询热线:吴小姐 13313868605
