【问题标题】:Generate a database update scripts with Hibernate/Spring使用 Hibernate/Spring 生成数据库更新脚本
【发布时间】:2013-11-25 08:55:15
【问题描述】:

我有一个项目,我们曾经依靠休眠来更新数据库的更改(hibernate.hbm2ddl.auto=update)......即使在产品上...... 我正在迁移它以使用 liquibase。

我唯一担心的是,不是每个人都是我团队中的 sql 专家,所以我正在寻找一种简单的方法来生成 hibernate 在更新数据库时会完成的 sql 脚本。

我们都在使用 Intellij IDEA,但找不到这个功能。

你知道有什么工具可以做到这一点吗?

谢谢

【问题讨论】:

标签: java spring hibernate jpa liquibase


【解决方案1】:

要实际显示 Hibernate 从映射中生成的脚本,您可以:

  • 按照 Andrei I 的建议,将这两行添加到您的 application.properties:

    spring.jpa.hibernate.ddl-auto=validate
    logging.level.org.hibernate.tool.hbm2ddl=DEBUG
    

Hibernate 4.3 的来源:SchemaUpdate.java

  • 或使用以下代码手动生成这些脚本:

    LocalSessionFactoryBuilder sessionFactory = new LocalSessionFactoryBuilder(dataSource);
    sessionFactory.scanPackages("your.package.containing.entities");
    Dialect dialect = new MySQL5Dialect(); // select your dialect
    DatabaseMetadata metadata = new DatabaseMetadata(dataSource.getConnection(), dialect, sessionFactory);
    List<SchemaUpdateScript> scripts = sessionFactory.generateSchemaUpdateScriptList(dialect, metadata);
    
    Formatter formatter = FormatStyle.DDL.getFormatter();
    for (SchemaUpdateScript script : scripts) {
       System.err.println(formatter.format(script.getScript()) + ";");
    }
    

您甚至可以在@Test 中添加此代码,如here 所述。

祝你好运!

【讨论】:

  • 您有适用于 Hibernate 5.2 的解决方案吗?谢谢
【解决方案2】:

使用mvn hibernate4:exportpom.xml 转储的完整架构:

<!-- To export full DDL schema as it seeing by Hibernate run: mvn hibernate4:export -->
<plugin>
    <!-- http://mydevnotes.nicus.it/2013/03/generate-ddl-with-maven-jpa-hibernate-4.html -->
    <groupId>de.juplo</groupId>
    <artifactId>hibernate4-maven-plugin</artifactId>
    <version>1.1.0</version>
    <configuration>
        <hibernateDialect>org.hibernate.dialect.MySQLDialect</hibernateDialect>
        <delimiter>;</delimiter>
        <target>SCRIPT</target>
        <outputFile>${project.build.directory}/schema-hibernate4-maven-plugin.sql</outputFile>
    </configuration>
</plugin>

您可以复制必要的部分。

使用 LiquiBase,您可以通过 mvn liquibase:diffpom.xml 中的相应部分生成 DB 和 Hibernate 映射文件/注释之间的差异来获得更多选择:

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
    <configuration>
        <changeLogFile>${basedir}/src/main/resources/sql/master.xml</changeLogFile>
        <propertyFile>${liquibase.profile}</propertyFile>
        <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
        <logging>debug</logging>
        <outputFileEncoding>utf-8</outputFileEncoding>
        <driver>com.mysql.jdbc.Driver</driver>
        <!-- <url>jdbc:mysql://localhost:3306/app?autoReconnect=true&amp;characterEncoding=utf-8</url> -->
        <!-- <username>AAAAAA</username> -->
        <!-- <password>BBBBBB</password> -->
        <defaultSchemaName>testx</defaultSchemaName>
        <changelogSchemaName>testx</changelogSchemaName>

        <!-- For mvn liquibase:updateSQL -->
        <migrationSqlOutputFile>migration.sql</migrationSqlOutputFile>

        <referenceUrl>hibernate:spring:com.app.domain?dialect=org.hibernate.dialect.MySQLDialect</referenceUrl>
        <diffChangeLogFile>changelogDiff.xml</diffChangeLogFile>
        <diffTypes>tables,views,columns,indexes,foreignkeys,primarykeys,uniqueconstraints</diffTypes>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>${spring-data.version}</version>
        </dependency>
        <!-- https://github.com/liquibase/liquibase-hibernate/wiki -->
        <dependency>
            <groupId>org.liquibase.ext</groupId>
            <artifactId>liquibase-hibernate4.2</artifactId>
            <version>3.5</version>
        </dependency>
    </dependencies>
</plugin>

你可以阅读我关于http://tips.defun.work/liquibase.html的笔记

【讨论】:

    【解决方案3】:

    好吧,我不知道一个非常简单的解决方案,但以下内容可能会对您有所帮助:

    在您的本地机器上启用您的日志库以显示 DDL 查询。例如看看here for an examplehere for hibernate log categories

    将所有更改保存到本地数据库(使用hibernate.hbm2ddl.auto=update)后,您将需要输出。在生产中使用hibernate.hbm2ddl.auto=validate

    最终您可能会考虑在一个特殊的服务器实例上执行此操作,并将所有 DDL 日志记录数据保存在一个特殊文件中。

    您还可以检查,当hibernate.hbm2ddl.auto=validate 时,hibernate 是否会提出更新查询。

    【讨论】:

      【解决方案4】:

      请看以下文章:

      Schema generation script from Hibernate

      它有点旧,但稍微调整一下应该可以解决问题:

      • 将配置对象中的“create”替换为“update”
      • 调整您的域的基本包名称
      • 仅使用您需要的方言生成它。在示例中,Oracle、MySQL 和 HSQL 使用了三种方言。

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        相关资源
        最近更新 更多