JPA数据库架构生成
一段時間以來, JPA的大多數主要實現,例如Hibernate , EclipseLink或OpenJPA ,都提供了生成數據庫模式對象的方法。 這些包括表,主鍵,外鍵,索引和其他對象的生成。 不幸的是,當處理多個環境時,這些不是實現之間的標準。 僅在最新的JPA 2.1規范中,才引入了Schema Generation標準化。
從現在開始,如果您使用的是Java EE 7 ,則不必擔心提供程序之間的差異。 只需使用新的標準屬性即可。 當然,您可能會認為根本不需要這些,因為不應像這樣管理環境的數據庫架構。 盡管如此,這些對于開發或測試目的還是非常有用的。
模式生成
特性:
如果希望對模式生成使用新的標準,只需將以下任何屬性添加到persistence.xml properties部分:
| javax.persistence.schema-generation.database.action 指定對數據庫架構要采取的措施。 可能的值不言自明。 如果此屬性不是特定的,則不會在數據庫中執行任何操作。 | 無,創建,拖放,創建,刪除 |
| javax.persistence.schema-generation.create-source 指定應如何創建數據庫模式。 可以僅通過使用在應用程序實體中指定的注釋元數據,通過執行SQL腳本或兩者的組合來實現。 您還可以定義順序。 無需指定此屬性即可生成架構。 默認值為元數據 。 如果結合使用create動作,則需要小心。 結果操作可能會在數據庫架構中生成意外行為并導致失敗。 | 元數據,腳本,元數據高于腳本,腳本然后元數據 |
| javax.persistence.schema-generation.drop-source 與javax.persistence.schema-generation.create-source相同 ,但用于放置動作。 | 元數據,腳本,元數據高于腳本,腳本然后元數據 |
| javax.persistence.schema-generation.create-script-source,javax.persistence.schema-generation.drop-script-source 指定要在創建或刪除數據庫模式時執行的SQL腳本文件的目標位置。 | 要執行的文件URL的字符串 |
| javax.persistence.sql-load-script-source 指定SQL文件的目標位置,以將數據加載到數據庫中。 | 要執行的文件URL的字符串 |
此外,還可以使用“模式生成”操作來生成SQL腳本:
| javax.persistence.schema-generation.scripts.action 指定應生成的SQL腳本。 僅當指定了相應的生成位置目標時,才生成腳本。 | 無,創建,拖放,創建,刪除 |
| javax.persistence.schema-generation.scripts.create-target,javax.persistence.schema-generation.scripts.drop-target 指定生成SQL腳本文件以創建或刪除數據庫模式的目標位置。 | 要執行的文件URL的字符串 |
樣品
以下示例刪除并創建JPA應用程序所需的數據庫模式對象。 依賴于實體的注釋元數據,還執行一個名為load.sql的任意SQL文件。
persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"><persistence-unit name="MyPU" transaction-type="JTA"><properties><property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/><property name="javax.persistence.schema-generation.create-source" value="metadata"/> <property name="javax.persistence.schema-generation.drop-source" value="metadata"/> <property name="javax.persistence.sql-load-script-source" value="META-INF/load.sql"/> </properties></persistence-unit> </persistence>另一個示例將生成要創建的數據庫架構對象,并將其放置在目標位置:
persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistenceversion="2.1"xmlns="http://xmlns.jcp.org/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"><persistence-unit name="MyPU" transaction-type="JTA"><properties><property name="javax.persistence.schema-generation.scripts.action" value="drop-and-create"/><property name="javax.persistence.schema-generation.scripts.create-target" value="file:/tmp/create.sql"/><property name="javax.persistence.schema-generation.scripts.drop-target" value="file:/tmp/drop.sql"/></properties></persistence-unit> </persistence>這兩個示例也可以組合在一起以刪除和創建數據庫對象,并生成執行這些操作的相應腳本。 您可以在Github上托管的Java EE Samples項目中找到這些示例和其他示例。
局限性
如前所述,建議您僅將這些屬性用于開發或測試目的。 錯誤的設置可能會輕易破壞或破壞您的生產數據庫。
沒有更新或驗證架構的操作。 我找不到他們未將其納入規范的原因,但這是改進建議的問題 。
數據庫模式操作僅在Java EE環境中的應用程序部署上執行。 為了進行開發,您可能希望在服務器重啟時執行操作。
支持
與Wildfly和Glassfish捆綁在一起的Hibernate和EclipseLink都支持這些屬性。
OpenJPA當前不支持這些屬性,但是我一直在為標準Schema Generation提供OpenJPA支持。 如果您好奇或想了解進度,請在此處查看我的Github存儲庫。 實際上,這是我寫這篇文章的主要動機,因為我參與了該功能的實現。
希望您喜歡這個職位:)
翻譯自: https://www.javacodegeeks.com/2015/03/jpa-database-schema-generation.html
總結
以上是生活随笔為你收集整理的JPA数据库架构生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Servlet和异步Servlet
- 下一篇: Hibernate自动提交命令强制MyS