2017-02-09 45 views
11

實際上我正在開發我的Spring啓動應用程序項目,並且我注意到有時在另一臺服務器(SQL Server)上有時會連接到我的數據庫,特別是當我嘗試使用FlyWay執行一些腳本遷移時,經過幾次嘗試。然後我注意到,我沒有在我的屬性spring.jpa.hibernate.ddl-auto中指定。然後我做了一些研究,發現它建議在開發中添加 spring.jpa.hibernate.ddl-auto= create-drop。 並將其更改爲:spring.jpa.hibernate.ddl-auto= none正在生產中。但是我沒有真正理解它是如何工作的,以及hibernate如何使用create value或none來生成數據庫模式。您可以請技術上解釋它是如何工作的,以及在開發和生產服務器中使用此屬性的建議是什麼。 謝謝spring.jpa.hibernate.ddl-auto屬性在Spring中如何工作?

+0

FWIW JPA 2.1有一個_standard_屬性javax.persistence.schema-generation.database.action,因此實際上並不需要使用JPA供應商特定的屬性來生成模式。 –

回答

22

有關記錄,spring.jpa.hibernate.ddl-auto屬性是特定於Spring Data JPA,並且是它們指定最終將傳遞給Hibernate的值的方法,該值屬性爲hibernate.hbm2ddl.auto

createcreate-dropvalidate,並update基本上影響架構管理工具將如何處理在啓動數據庫模式。

例如,update操作將查詢JDBC驅動程序的API以獲取數據庫元數據,然後Hibernate根據讀取的註釋類或HBM XML映射比較其創建的對象模型,並嘗試調整模式-飛。

例如,update操作將嘗試添加新列,約束等,但不會刪除以前可能存在但不再作爲先前運行的對象模型的一部分的列或約束。

通常在測試用例場景中,您可能會使用create-drop,以便創建模式,測試用例添加一些模擬數據,運行測試,然後在測試用例清理期間刪除模式對象,留下一個空的數據庫。

在開發過程中,通常會看到開發人員使用update自動修改架構以在重新啓動時添加新的添加項。但是再次明白,這不會刪除以前執行中不再需要的列或約束。

在生產中,通常強烈建議您使用none或者根本不指定此屬性。這是因爲數據庫管理員通常會檢查數據庫更改的遷移腳本,特別是如果您的數據庫跨多個服務和應用程序共享。

+1

是的,從來沒有在生產中使用ddl代。我們使用ddl爲表結構生成初始腳本,並在該過程中涉及DBA。然後,我們將db腳本作爲部署單元的一部分,並在部署應用程序時使用Flyway執行它們。當我們需要修改數據庫時,我們將新腳本添加到下一個版本的應用程序並部署到分段。 Flyway將自動檢測當前版本並運行將數據庫轉換爲最新版本所需的腳本。如果一切正常,我們將部署到生產環境 –

+0

如果我們不指定此屬性,該怎麼辦?例如我有我自己的 ... 更新 我有這個和由於某種原因,我的表總是下降,直到我加入上述屬性;; PS:對代碼示例抱歉) –

+0

我有H2和春季啓動決定它必須使用」創建 - 刪除「,我想這覆蓋了我設置的屬性 https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html –