【问题标题】:Support for schema migrations with JPA?支持使用 JPA 进行模式迁移?
【发布时间】:2011-01-04 09:33:11
【问题描述】:

我最近一直在简单地研究 JPA,我想知道数据库架构迁移和与您创建的类保持一致是什么。

JPA 是否支持这些东西?公用事业?最佳实践?

干杯!

【问题讨论】:

  • 我最近读了一本关于 JPA 的书。 JPA 2.1 于 2013 年发布,现在是否支持迁移?

标签: jpa schema-migration


【解决方案1】:

我不会依赖 JPA 提供程序来更新数据库模式。 查看Liquibase 了解其中一种好方法。

【讨论】:

    【解决方案2】:

    简短的回答是否。

    如果您更改 bean,则必须手动迁移现有架构。因此,对于 Rails 风格的数据库迁移,您将不得不寻找其他地方。

    但是,您可以轻松地从 Java bean 生成初始 ddl。下面的示例说明了使用 EclipseLink 2.0 版创建模式:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
        <persistence-unit name="JPATestPU" transaction-type="RESOURCE_LOCAL">
            <provider>
                org.eclipse.persistence.jpa.PersistenceProvider
            </provider>
            <class>org.randompage.MyEntity</class>
            <properties>
                <property name="javax.persistence.jdbc.user" value="johndoe"/>
                <property name="javax.persistence.jdbc.password" value="secret"/>
                <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
                <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/.h2/testdb;FILE_LOCK=NO"/>
                <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
                <property name="eclipselink.logging.level" value="INFO"/>
            </properties>
        </persistence-unit>
    </persistence>
    

    这里的关键元素是

     <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
    

    这告诉 EclipseLink 删除现有表并从您的 JPA 映射中生成一次新表。此过程是高度特定于供应商的,因此对于其他 JPA 供应商(Hibernate、OpenJPA...),您必须查阅他们的特定文档。

    【讨论】:

    • 自己编写persistence.xml 单元文件比较困难(它是公开记录的并且是非常“通用”(=vendor-independent)的格式,但值是特定于供应商的)。但是,大多数现代 IDE(如 NetBeans)都提供了一种为您管理它的方法。当然你可以自己写,但是有很多陷阱和陷阱在等着你,但会教你很多(肯定)。
    • 这仅适用于初始化(新创建)数据库方案时。因此,您可能必须编写自己的迁移工具,这可能有点棘手。也许像在一个项​​目和单独的数据库中保留旧实体和更新实体之类的东西。然后连接到两个数据库并从旧数据库加载旧实体并将新实体写入(持久)到新数据库?
    【解决方案3】:

    如果您将generateDdl 设置为Hibernate(如果它是底层实现),那么它会根据您当前的方言生成数据库模式。所以更改方言后会自动生成数据库。

    其他 JPA 提供程序可能对此有不同的属性。

    【讨论】:

    • 这是正确的,但它并没有解决架构迁移的问题。
    • @HDave - 相反。架构被复制到新数据库,反映当前的数据模型。
    • 通过模式迁移,我相信 OP 意味着拥有可以使用现有数据库和数据并使其与新实体/模式保持同步的脚本。这通常涉及对模式更改的仔细研究,有时还包括数据的卸载/重新加载,以便可以更改 FK、可以拆分 PK 等。Hibernate 可以生成脚本来创建新模式。 Hibernate 还可以生成一个脚本来修改旧模式以使其成为新模式,但它假定数据库没有数据——即使这样,我的理解是由于“问题”而很少使用该功能。
    猜你喜欢
    • 2011-04-24
    • 2012-02-03
    • 2011-12-07
    • 2013-10-08
    • 2020-05-12
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多