前提
1、jhipster環境,jdk1.8,yeoman,node.js安裝環境參考官方wiki,環境問題參考我的博客,如果出現注冊中心空白頁,請參考博客
2、首先需要啟動jhipster基礎服務,jhipster-registry-master,uaa,gateway,新建一個微服務應用,參考官方文檔
3、創建實體,cd到微服務目錄,自動創建數據庫,參考官方文檔,這里我們創建一個clazz實體,本文主要修改這個實體,有一個classNo int型,className Stirng型
4、還需要知道how to 查詢dev環境的數據庫,比較簡單,簡單講下:啟動新建的微服務應用,查看端口號(這里以8081舉例),訪問 localhost:8081/h2-console
上圖中就是我們熟悉的查詢界面了,接下來我們看看修改數據庫
正文
鑒於jhipster升級/修改數據庫結構有 三種方式,這里分開來介紹下
使用entity sub-generator 更新數據庫
1、cd到需要修改的微服務應用項目文件夾
2、運行entity sub-generator:命令 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,參考官方文檔
<?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、對於每次啟動都會報錯這個錯誤,還有種簡單粗暴的方法是刪除target ,祝成功:)
聲明:本博文為本人實際操作經驗寫成,轉載請注明出處,或者別讓我看到