SpringBoot+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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM