springmvc+hibernate祖传代码升级springboot

目前公司老产品都是spingmvc+hibernate架构,在微服务横行的今天已经稍显落后,早在15年我在做caas的时候就尝试过把caas的springmvc升级到springboot,由于对springboot的不熟悉,以及犯了方向性错误,直接尝试把hibernate往jpa过渡,结果以失败而告终,不过最终借助威思客3升级,我把caas的springmvc改成了springboot,后台数据库层全部重写了一遍。
最近开始重构meeting,仍然遇到了老问题,meeting中祖传dao层代码直接改成springdatajpa肯定是不可行的,工作量也超大,乔提出了仍然使用hibernate,按照之前改造失败的经验,加上这两年使用springboot的经验积累,觉得这是个可行的办法,不管springdatajpa还是hibernate,最后还不都是基于spring的管理的。
废话少说,说干就干,开工。
把祖传代码BaseDao等代码复制过来,加入hibernate的一系列jar包,注意版本号,spring自动注入进来的hibernate版本号不同,我们的配置方法不同,其中springboot2.x自动注入的hibernate是5.2以后的版本,这个版本和我们的祖传代码写法完全不同,所以,如果不想改祖传代码,请把hibernate降级到5.2以下,5.0以上。5.0以下没试过,按道理4以上应该都可以,具体没试过,如果hibernate版本不对,sessionfactory是注入不进来的。

注意basedao包含有spring自动注入进来的SessionFactory,这个是spring的xml配置文件配置的bean,SessionFactory需要依赖datasource,我就开始根据这两条线索开始各种google在springboot如何配置,还真找到了,SessionFactory配置如下:
import javax.persistence.EntityManagerFactory;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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);
}
}
另外,我们公司用的数据源是druid,从别的项目拷贝过来直接用
/**
* Created by lihongyuan on 2016/8/15.
*/
@Slf4j
@Configuration
public class DruidConfiguration {

@Value("${spring.datasource.driverClassName}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.initialSize}")
private int initialSize;
@Value("${spring.datasource.minIdle}")
private int minIdle;
@Value("${spring.datasource.maxActive}")
private int maxActive;
@Value("${spring.datasource.maxWait}")
private int maxWait;
@Value("${spring.datasource.validationQuery}")
private String validationQuery;
@Value("${spring.datasource.testOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.testOnReturn}")
private boolean testOnReturn;
@Value("${spring.datasource.testWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.removeAbandoned}")
private boolean removeAbandoned;
@Value("${spring.datasource.removeAbandonedTimeout}")
private int removeAbandonedTimeout;
@Value("${spring.datasource.logAbandoned}")
private boolean logAbandoned;
@Value("${spring.datasource.filters}")
private String filters;
@Value("${spring.datasource.poolPreparedStatements}")
private boolean poolPreparedStatements;
@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
private int maxPoolPreparedStatementPerConnectionSize;

@Order(1)
@Bean
@Primary
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();

datasource.setDriverClassName(driverClassName);
datasource.setUrl(url);
datasource.setUsername(username);
datasource.setPassword(password);
// 其它配置
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource
    .setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
try {
  datasource.setFilters(filters);
} catch (SQLException e) {
  log.error("druid configuration initialization filter", e);
}
return datasource;

}

/**
* 注册一个StatViewServlet

* @return
/
@Bean
public ServletRegistrationBean DruidStatViewServle2() {
ServletRegistrationBean servletRegistrationBean =
new ServletRegistrationBean(new StatViewServlet(), "/druid/
");

// 添加初始化参数:initParams
/** 白名单,如果不配置或value为空,则允许所有 */
// servletRegistrationBean.addInitParameter("allow", "127.0.0.1,192.0.0.1");
/** 黑名单,与白名单存在相同IP时,优先于白名单 */
// servletRegistrationBean.addInitParameter("deny", "192.0.0.1");
/** 用户名 */
servletRegistrationBean.addInitParameter("loginUsername", "admin");
/** 密码 */
servletRegistrationBean.addInitParameter("loginPassword", "druid");
/** 禁用页面上的“Reset All”功能 */
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;

}

/**
* 注册一个:WebStatFilter

* @return
*/
@Bean
public FilterRegistrationBean druidStatFilter2() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());

/** 过滤规则 */
filterRegistrationBean.addUrlPatterns("/*");
/** 忽略资源 */
filterRegistrationBean.addInitParameter("exclusions",
    "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;

}

启动,报错,No CurrentSessionContext configured,感觉有戏了,继续查原因,翻了一下祖传代码的xml配置,发现current_session_context_class没有配置,这好办,查一下springboot如何配置就行了,注意,和你用的hibernate版本号相对应,如下。
spring:
application:
name: microservice-provider
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
username: 
password: 
driverClassName: com.mysql.jdbc.Driver
initialSize: 3
minIdle: 3
maxActive: 20
maxWait: 60000
validationQuery: SELECT 1
testOnBorrow: true
testOnReturn: false
testWhileIdle: true
minEvictableIdleTimeMillis: 25200000
timeBetweenEvictionRunsMillis: 60000
removeAbandoned: true
removeAbandonedTimeout: 1800
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
logAbandoned: true
filters: stat,wall,log4j
jpa:
database: MYSQL
database-platform: org.hibernate.dialect.MySQLDialect
show-sql: true
hibernate:
ddl-auto: update
#naming-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext

最后controller层的代码就不用说了,基本上springboot的controller层和springmvc可以通用。

  • 1
    点赞
  • 2
    评论
  • 4
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

李鸿远

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值