一段时间以来, 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"?>
<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.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