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