前提
1,jhipster 环境, jdk1.8,yeoman,node.js 安装环境参考官方 wiki https://www.jhipster.tech/installation/ , 环境问题参考我的博客, 如果出现注册中心空白页, 请参考博客
2, 首先需要启动 jhipster 基础服务, jhipster-registry-master,uaa,gateway, 新建一个微服务应用, 参考官方文档 https://www.jhipster.tech/creating-microservices/
3, 创建实体, cd 到微服务目录, 自动创建数据库, 参考官方文档 https://www.jhipster.tech/creating-an-entity/ , 这里我们创建一个 clazz 实体, 本文主要修改这个实体, 有一个 classNo int 型, className Stirng 型
4, 还需要知道 how to 查询 dev 环境的数据库, 比较简单, 简单讲下: 启动新建的微服务应用, 查看端口号 (这里以 8081 举例), 访问 localhost:8081/h2-console
上图中就是我们熟悉的查询界面了, 接下来我们看看修改数据库
正文
鉴于 jhipster 升级 / 修改数据库结构有 三种方式, 这里分开来介绍下
使用 entity sub-generator 更新数据库
1,cd 到需要修改的微服务应用项目文件夹
2, 运行 entity sub-generator https://jhipster.github.io/creating-an-entity/ : 命令 yo jhipster:entity 需要修改的实体名 (第一次是创建, 如果已经存在则提示修改)
3, 根据需要选择添加字段到这个实体, 还是删除字段, 这里没有修改, 可以使用 remove 之后再添加, 这里选添加做测试, 添加一个名为 class_desc, 字段类型为 String
不继续输入 n, 当然了如果想继续添加也无所谓, 后边添加约束也可以不添加
此时这个实体就修改完毕了, 同时自动创建 changelog 到
src/main/resources/config/liquibase/changelog
目录中, 并且自动添加到
src/main/resources/config/liquibase/master.xml
文件中, 这里就是 liquibase 等待这个项目启动去改变数据库的事了.
这一切都是自动发生的, 如果仅想简单的修改表结构, 可以这样, 也不用继续看下文了, 启动项目即可
手动编辑 changelog 更新数据库
当然这种一看就是最麻烦的那种, 其实不难
1, 修改 jpa 实体, 比如我现在想为 clazz 实体和数据库添加一个字段 class_test, 类型为 String
2, 编写 changelog 文件
创建 changelog 文件到
src/main/resources/config/liquibase/changelog
命名格式为 yyyMMddHHmmss_描述. xml(可以少写一些), 例如这里就用 201804131020_modify_entity_Clazz.xml, 参考官方文档 http://www.liquibase.org/documentation/changes/
- <?xml version="1.0" encoding="utf-8"?>
- <databaseChangeLog
- xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
- xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd
- http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
- <property name="now" value="now()" dbms="h2"/>
- <property name="now" value="now()" dbms="mysql"/>
- <property name="autoIncrement" value="true"/>
- <property name="floatType" value="float4" dbms="postgresql, h2"/>
- <property name="floatType" value="float" dbms="mysql, oracle, mssql"/>
- <!--
- add column class_test to table clazz
- -->
- <changeSet id="2018041320" author="hellxz"> <!-- 注意, 这个 id 必须为当前时间的值, 格式为: yyyyMMddHHmmss, 否则启动会报错 -->
- <addColumn tableName="clazz">
- <column name="clazz_test" type="varchar(50)"/>
- </addColumn>
- </changeSet>
- <!-- 下边的这些是增删改查的一些写法, 可以参考一下 -->
- <!--
- modify table clazz column from class_no to class_id
- -->
- <!-- <changeSet id="201804131020" author="hellxz">
- <renameColumn tableName="clazz" oldColumnName="class_no" newColumnName="class_id"/>
- </changeSet> -->
- <!--
- modify table clazz column class_id from integer datetype to varchar
- -->
- <!-- <changeSet id="201804131105" author="hellxz">
- <modifyDataType tableName="clazz" columnName="class_id" newDataType="varchar(50)" schemaName="public"/>
- </changeSet> -->
- <!--
- drop column class_id from table clazz
- -->
- <!-- <changeSet id="201804131113" author="hellxz">
- <dropColumn tableName="clazz" columnName="class_id"/>
- </changeSet> -->
- <!--
- add new column class_info datatype varchar
- -->
- <!-- <changeSet id="201804131141" author="hellxz">
- <addColumn tableName="clazz">
- <column name="class_id" type="varchar(255)"/>
- </addColumn>
- </changeSet> -->
- </databaseChangeLog>
3, 将上边修改的文件路径添加 changelog 到
src/main/resources/config/liquibase/master.xml
中
- <?xml version="1.0" encoding="utf-8"?>
- <databaseChangeLog
- xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
- <!-- jhipster-needle-liquibase-add-changelog - JHipster will add liquibase changelogs here -->
- <!-- jhipster-needle-liquibase-add-constraints-changelog - JHipster will add liquibase constraints changelogs here -->
- <include file="config/liquibase/changelog/201804131020_modify_entity_Clazz.xml" relativeToChangelogFile="false"/>
- </databaseChangeLog>
4, 重新启动微服务应用, 如果没有 error, 请进入 h2-console 查看,
下边是正常情况下的数据库情况
使用 Maven liquibase:diff 更新数据库
最后这种没有尝试成功, 不知道哪步弄错了, 大家可以参考
开发流程如下
修改 jpa 实体 (增删字段, 修改关联关系等)
编译程序
运行 mvnw liquibase:diff
生成变更日志在
src/main/resources/config/liquibase/changelog
目录
查看变更日志, 删除多余更新内容, 保留必要更新, 重命名文件为有意义文件名, 比如
20161012021042_modify_name_length.xml
, 并添加到
src/main/resources/config/liquibase/master.xml
重启生效
问题解决
1, 启动项目输出如下:
解决办法:
进入刚才修改的 changelog 文件中, 请修改刚才写的 id 为当前时间值 yyyyMMddHHmmss, 分钟不能差, 秒也可以不写, 重启应用试验
注意如果修改之后还是这样, 请查看 master.xml 中是否 include 其他时间已经过期的文件, 注释掉即可
2, 出现如下图问题
这个问题是说之前我们已经创建了这个字段, 进入 h2-console 查看, 的确存在
3, 对于每次启动都会报错这个问题, 我的建议是注释掉 master.xml 中引入的文件
来源: https://www.cnblogs.com/hellxz/p/8819503.html