弹簧启动和休眠:打印/记录 DDL

2022-09-02 12:43:10

在我添加了一个或多个具有数据库映射(JPA/休眠)的类之后,我希望Hibernate打印出必要的模式更新,以便我可以在数据库上执行它们(例如通过FlyWay)。我不希望自动执行更新。

似乎对此有一定控制权的唯一属性是:

org.hibernate.tool.hbm2ddl=validate|update|create|create-drop|none

我不想自动更新/更改任何内容。我想将其设置为验证或无。当我这样做时,我看不到生成的架构。

我经典的弹簧应用程序,我曾经使用休眠类来打印DDL。SchemaExport

SchemaExport schemaExport = new SchemaExport(cfg);
schemaExport.execute(true, false, false, false);

我可以在Spring Boot中使用类似的东西吗?


答案 1

这就是我所做的...

首先,我进行实体更改,然后将这些更改为:

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

然后

  1. 重新运行我的应用,并让休眠对数据库进行更改。
  2. 进入日志并复制用于更新数据库的休眠 sql
  3. 将该 sql 粘贴到新的 Flyway 脚本中
  4. 舒顿启动应用程序
  5. 删除本地数据库
  6. 更改 ddl-auto 回以验证
  7. 重新启动启动应用
  8. 测试以确保 Flyway 进行了正确的更新。Hibernate和Flyway现在将同步。

答案 2

即使打开了调试,设置 show-sql 的解决方案也对我不起作用,所以我最终编写并运行了这个简单的类。

public class SchemaExporter{

public static org.hibernate.cfg.Configuration getConfiguration() {
    org.hibernate.cfg.Configuration cfg = new org.hibernate.cfg.Configuration();
    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
    scanner.addIncludeFilter(new AnnotationTypeFilter(Entity.class));
    for (BeanDefinition bd : scanner.findCandidateComponents("com.package.where.my.entitybeans.are")) {
        String name = bd.getBeanClassName();
        try {
            System.out.println("Added annotated entity class " + bd.getBeanClassName());
            cfg.addAnnotatedClass(Class.forName(name));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
    cfg.setProperty("hibernate.show_sql", "true");
    cfg.setProperty("hibernate.format_sql", "true");
    cfg.setProperty("hibernate.hbm2ddl.auto", "update");
    cfg.setProperty("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");

    cfg.setProperty("hibernate.connection.url", CONNECTIONURL);
    cfg.setProperty("hibernate.connection.username", USERNAME);
    cfg.setProperty("hibernate.connection.password", PWD);
    cfg.setProperty("hibernate.connection.driver", DRIVER);
    return cfg;
}

public static void main(String[] args) {
    SchemaExport export = new SchemaExport(getConfiguration());
    export.setDelimiter(";");
    export.setHaltOnError(true);
    export.setFormat(true);
    export.create(true,true);
}

}

运行它,我可以在控制台中看到DDL,并按照Chris的建议继续


推荐