需求描述需求是这样的:因为我们目前的一个老项目是Oracle数据库的,这个库呢,数据库是没有注释的,而且字段名和表名都是大写风格,比如在代码层面的po呢,以前也是没有任何注释的,但是经过这些年,大家慢慢踩坑多了,也给po加上了一些注释了,比如:现状就是这样,再说说目标是:希望把这个库能转成mysql,表名和字段名最好都用下划线分隔每个单词,字段呢,最好能有注释。也就是差不多下面这样:方案分析最早我尝试的就是hibernate正向工程,建一个空的mysql库,然后配置hibernate的选项为:这样的话呢,就会自动在我们指定的mysql数据库生成表了,不过,有两个瑕疵是:生成的表,字段和表名都是和PO里一样的驼峰格式;没有注释。第一个问题,我这边是通过覆盖hibernate源码的方式解决,将驼峰转换为了下划线;第二个问题,麻烦一些,因为要做到字段带注释的话,那就得看看哪里能拿到注释。hibernate执行过程中,从PO类里?不可能,编译好的class里,怎么会有注释呢?那就只能从源文件着手了,PO类的源码里,field上是有注释的,那就必须要去解析PO类的java文件,从里面提取出每个PO类中:字段--》注释的对应关系来。大方向已定,我们开搞!最后我这里解决这两个问题,是覆盖了三个hibernate的类的源码,大概如下:在继续之前,先说明一下,这个肯定是要修改hibernate源码的,这里只讲讲怎么覆盖某个jar包里的类:我这里是spring mvc的老项目,最后是部署在tomcat运行,tomcat的WebAppClassloader,负责加载以下两个路径的class:覆盖的原理,就是依赖其查找class的先后顺序来做,比如lib下的某个jar包有:org.hibernate.mapping.Table这个类,正常情况下,都会加载到这个类;但如果我们在classes下放一个同包名同类名的类,那么就会优先加载我们的这个class了。但是假设这个类引用了hibernate的其他类B,不影响,毕竟我们没覆盖类B,所以还是会到lib下查找,最后还是会使用hibernate jar包中的B。最终源码已经放在了:https://github.com/cctvckl/work_util/tree/master/Hibernate_PositiveEngineer问题1解决步骤:驼峰格式的建表语句转下划线知道怎么覆盖了,再说说怎么去找要覆盖哪儿,这个需要一点经验。我这里先还原成没修改时的样子,跑一下项目,发现日志有以下输出:2019-10-23 13:47:11.819 [main] DEBUG [] org.hibernate.SQL - drop table if exists KPIRECORD2019-10-23 13:47:11.823 [main] DEBUG [] org.hibernate.SQL - create table KPIRECORD ( kpiRecordId varchar(255) not null, endTime varchar(255), evaluatorId varchar(255), kpiComment varchar(255), kpiDate datetime, kpiValue double precision, roleCode integer, startTime varchar(255), superiors varchar(255), userId varchar(255), primary key (kpiRecordId) )2019-10-23 13:47:11.988 [main] INFO [] org.hibernate.tool.hbm2ddl.SchemaExport - HHH000230: Schema export complete其他不重要,我们看最后一行,里面包含了Schema export complete,这个肯定是代码里的日志,我们拿这个东西,在代码里搜一波(这一步,要求maven是下载了jar包的源码):接下来,我们点进去,因为maven下载了源码的关系,所以再利用idea的findUsage功能,剩下的,就是在觉得比较靠谱的地方打上断点,运行一下,debug一下,大概就知道流程了。找啊找,找到了下面的地方,(org.hibernate.mapping.Table#sqlCreateString)怎么覆盖,不用多说了吧,如果是spring mvc(或者spring boot)架构,都要在最上层的module里的src下操作,加上这么一个全路径一致的类,然后将里面的sqlCreateString改写。我这里附上改写后的:到这里,基本搞定了第一个问题。问题2解决步骤:给建表语句增加注释其实这个步骤分成了2个小步骤,第一步是拿到下面这样的数据:第二步,就是像上面第一步那样,在生成create table语句时,根据table名称,取到上面这样的数据,然后再根据列名,取到注释,拼成一条下面这样的(重点是下面加粗部分):start_time varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '考评开始时间',问题2解决步骤之第一步:获取表字段注释这部分纯粹考验字符串解析功力了,我说下思路,也可以直接看源码。主要是逐行读取java文件,然后看该行是否为注释(区分单行注释和多行注释):单行: /** 被考评人*/ private String userId;多行: /** * 主键,考评记录ID */ private String kpiRecordId;单行注释的话,直接用正则匹配;多行的话,会引入一个状态变量,最后还是会转换为一个单行注释。匹配上后,提取出注释,存到一个全局变量;如果下一行正则匹配了一个field,则将之前的注释和这个field凑一对,存到map里。大致流程就是这样的,代码如下:问题2解决步骤之第二步:覆盖hibernate源码,建表过程中构造注释这次覆盖了org.hibernate.cfg.Configuration#generateSchemaCreationScript方法:然后里面的内容也不用我细说了,再次根据列名查找注释,构造建表sql就行了。这里加个成果展示:总结希望对大家有所帮助,有疑问可以直接加我。源码在:https://github.com/cctvckl/work_util/tree/master/Hibernate_PositiveEngineer

10-23 23:37

hibernate h2变mysql_懒要懒到底,能自动的就不要手动,Hibernate正向工程完成Oracle数据库到MySql数据库转换(含字段转换、注释)...相关推荐

  1. hibernate h2变mysql_struts2-hibernate-mysql开发案例 -解道Jdon

    Hibernate专题 struts2-hibernate-mysql开发案例与源码 源码下载 本案例展示使用Struts2,Hibernate和MySQL数据库开发一个个人音乐管理器Web应用程序. ...

  2. 使用oracle数据库和MySQL数据库时hibernate的映射文件.hbm.xml的不同

    假设是使用oracle数据库.那么hibernate的映射文件.hbm.xml例如以下: <id name="xuehao" column="xuehao" ...

  3. orcle抽数据到mysql_抽取oracle数据到mysql数据库的实现过程

    在oracle数据库迁移至mysql数据库,除了oracle数据库模型移到mysql外,还一个重点环节就是要将oracle数据库的数据移到mysql数据库,本人尝试用过多个数据迁移程序,性能都不是很好 ...

  4. linux启动mysql_【数据库】MySQL数据库入门学习

    Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一. ...

  5. 从sqlserver中数据写入mysql_从SQL server数据库导入Mysql数据库的体验

    起原:网海拾贝  ,因任务需要,要将寄存在sqlserver数据库中的数据全部导入到mysql数据库中,在网上集合关连资料,找到两种体例,而今分袂谈谈对他 起原:网海拾贝 因任务需要,要将寄存在sql ...

  6. 在ThinkPHP框架(5.0.24)下引入Ueditor并实现向七牛云对象存储上传图片同时将图片信息保存到MySQL数据库,同时实现lazyload懒加载...

    这是我花了很多天的时间才得以真正实现的一组需求. 文章后面有完整Demo的GitHub链接. 一. 需求描述 1. 应用是基于ThinkPHP5开发的: 2. 服务器环境是LNMP,PHP版本是7.2 ...

  7. h2 迁移到 mysql_[saiku] 将saiku自带的H2嵌入式数据库迁移到本地mysql数据库

    saiku数据库的表和用户默认创建是在启动项目的时候,通过初始化 saiku-beans.xml 中的 h2database 这个 bean 执行org.saiku.service.Database类 ...

  8. 【懒人必备】智能窗帘机器人,告别手动拉窗帘——硬件设计篇

    简介:智能窗帘机器人方案,无需专业人员上门安装,使普通窗帘秒变智能窗帘. 概述 随着智能家居的深入拓展,智能窗帘凭借成熟的技术和产品,逐步成为了智能家居家庭中的标配,在家装智能化市场有很高的应用价值. ...

  9. MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚

    MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚 一.关于UTF-8 UTF-8 Unicode Transformation Format-8bit.是用以解决 ...

最新文章

  1. 利用反射实现类的动态加载
  2. 写代码做副业月入10K+的方法都藏在这几个公众号
  3. VTK与ITK的详细安装指南
  4. 20165328 预备作业3 Linux安装及命令
  5. 百度地图与谷歌地球的偏差调整
  6. [Reomting Debug] 巧用VS 的remote debug 功能远程调试程序 经验分享.
  7. BJRangeSliderWithProgress
  8. route debugger
  9. Bundle Adjustment原理及应用
  10. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_8 响应json数据之响应json格式数据...
  11. java 封装返回json数据
  12. 在Windows11的虚拟机安装WindowsServer2016并测试DNS功能
  13. 设置Chrome新标签页为自定义地址页面
  14. 实话谈扶贫第一篇——教育扶贫
  15. android#boardcast#广播实现强制下线功能
  16. VTS manifest xml
  17. 论文笔记2:Deep Attention Recurrent Q-Network
  18. BI案例:BI在连锁零售业应用(ZT)【转】
  19. 《Linux内核设计与实现》读书笔记
  20. 精华笔记 112314

热门文章

  1. scrapy的name变量_Python3 Scrapy框架学习四:爬取的数据存入MongoDB
  2. rgb sw 线主板接口在哪_十代至尊i910980XE直接上:技嘉X299X AORUS MASTER主板评测
  3. 蓄水池问题c语言编程,蓄水池大作战
  4. 阿当姆斯matlab,数值计算方法与MATLAB应用
  5. buffer转int python_C/C++实战014:字符串转换及Python传参数组
  6. 三、HDFS中的Python 和JavaAPI
  7. 三十一、深入Python中的正则表达式
  8. 一、Java入门和环境安装
  9. 教师编学科知识计算机,教师考试信息技术学科知识考什么_谈信息技术学科教师应该怎样教学...
  10. Vue 学习第五天 学习笔记