本文參考
- 用屬性控制Hibernate生成DDL
- SpringBoot啟動時初始化數據庫及spring.jpa.generate-dll與spring.jpa.hibernate.ddl-auto之間的困惑
- SpringBoot啟動時初始化數據庫及spring.jpa.generate-dll與spring.jpa.hibernate.ddl-auto之間的困惑
- 60.1 Initialize a database using JPA
SpringBoot項目中初始化數據庫的兩種方法
- 讓SpringBoot根據腳本初始化表結構
- 讓JPA根據實體類進行初始化表結構
SpringBoot根據腳本初始化
結構初始化腳本文件由spring.datasource.schema屬性指定,數據初始化腳本文件spring.datasource.data屬性指定。這兩個腳本是否執行的開關由spring.datasource.initialization-mode決定:always-一定執行,embedded-只對內存數據庫執行,never-不執行。
JPA根據類結構初始化
SpringBoot+JPA自動建表:spring.jpa.generate-ddl
JPA可以根據我們定義的@Entity實體類,來自動生成表結構。在SpringBoot+JPA項目中, 我們可以通過定義屬性spring.jpa.generate-ddl的值來控制這種行為。spring.jpa.generate-ddl是JPA層次的抽象,他和具體的JPA實現無關;默認值是false,如果你顯式設置為true,最后框架會選擇update方式。一般不建議設置這個屬性值
SpringBoot+Hibernate自動建表:spring.jpa.hibernate.ddl-auto
Hibernate作為JPA規范的實現框架,也可以根據我們定義的@Entity實體類,來自動生成表結構。在SpringBoot+Hibernate項目中,我們可以通過定義屬性spring.jpa.hibernate.ddl-auto的值來控制是否執行,可選的值為
- create表示每次應用啟動連接數據庫的時候,都會將之前的表全部drop掉,重新根據實體類生成一遍。
- create-drop 在create的基礎上,在應用關閉的時候還會drop一次。每次啟動應用,刪除之前的表,關閉應用時,刪除這次應用啟動建立的表。
- update可能是比較常用的,每次啟動的時候會看看實體類有什么變化,然后看需不需要更改表結構。但是它只能add column/constraint, 不會刪除原來的column/constraint,也不會修改column的數據類型。如果實體類的某個@Column屬性刪除了,重新啟動下應用,對應的字段並不會被刪除。
- validate不會對表進行更改,但是會看看他和實體類是否對應,如果實體類的field類型和表column的數據類型不一致,會報錯。
- none什么都不做
- 生產環境,強烈建立用none或者就不設置這個屬性
spring.jpa.generate-ddl和spring.jpa.hibernate.ddl-auto
- spring.jpa.generate-dll是jpa層面對數據表生成策略的控制,和具體的JPA實現無關。而spring.jpa.hibernate.ddl-auto是jpa實現hibernate層面上對數據表生成策略的控制。
- spring.jpa.generate-dll比spring.jpa.hibernate.ddl-auto有更強的控制力度,即使spring.jpa.hibernate.ddl-auto為none,只要spring.jpa.generate-dll為true,也會根據@Entity注解的實體類生成對應數據表。
- 前者會影響到后者,為了避免混淆和不好理解,這兩者最好不要混用。在實踐中,直接hibernate層面的屬性spring.jpa.hibernate.ddl-auto就行。
配置
spring.jpa.hibernate.ddl-auto=update
#spring.jpa.show-sql=true
#spring.jpa.generate-ddl=true