Java Spring引导和Hibernate:打印/记录DDL

Java Spring引导和Hibernate:打印/记录DDL,java,spring,hibernate,jpa,spring-boot,Java,Spring,Hibernate,Jpa,Spring Boot,在我添加了一个或多个具有数据库映射的类(JPA/hibernate)之后,我希望hibernate打印出必要的模式更新,以便我可以在数据库上执行它们(例如通过FlyWay)。我不希望自动执行更新 唯一一个似乎可以控制这一点的属性是 org.hibernate.tool.hbm2ddl=validate|update|create|create-drop|none 我不想自动更新/更改任何内容。我想将其设置为“验证”或“无”。当我这样做时,我看不到生成的模式 在一个经典的spring应用程序中,

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

唯一一个似乎可以控制这一点的属性是

org.hibernate.tool.hbm2ddl=validate|update|create|create-drop|none
我不想自动更新/更改任何内容。我想将其设置为“验证”或“无”。当我这样做时,我看不到生成的模式

在一个经典的spring应用程序中,我使用hibernate
SchemaExport
类来打印DDL

SchemaExport schemaExport = new SchemaExport(cfg);
schemaExport.execute(true, false, false, false);
我可以在Spring Boot中使用类似的东西吗?

我就是这么做的

首先对实体进行更改,然后将其设置为:

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

  • 重新运行我的应用程序,让hibernate对数据库进行更改
  • 进入日志并复制hibernate用于更新数据库的sql
  • 将该sql粘贴到新的Flyway脚本中
  • Shudown启动应用程序
  • 删除本地数据库
  • 将ddl auto更改回validate
  • 重新启动启动应用程序
  • 测试以确保Flyway进行了正确的更新。Hibernate和Flyway现在将同步

  • 设置showsql的解决方案即使在debug打开的情况下也不适用于我,因此我最终编写并运行了这个简单的类

    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的建议继续运行

    如果将其设置为validate/none,则明确告诉它不要生成DDL。SpringBoot只是标准的Spring,它具有一些常规的配置特性,可以最大限度地减少所需的配置量。所以仍然可以像以前一样使用
    SchemaExport
    。同意,但我不知道从哪里获取要传递到
    SchemaExport
    Configuration cfg
    参数。在
    ConfigurableApplicationContext=SpringApplication.run(Application.class,args)之后,我无法执行此操作因为应用程序已崩溃。我已将hbm2ddl设置为“验证”。也许将此设置为“无”可以解决此问题,但我宁愿保留额外的检查。您是否尝试将其设置为
    none
    ?使用
    validate
    的全部要点是,如果模式无效,启动就会失败。听起来您明确希望应用程序启动,尽管数据库不同步,但不应用迁移。这就是
    none
    设置的目的。这些行的可能重复应该放在类路径根目录下的application.properties中。除上述属性外,我还必须在我的application.properties文件中包含“debug=true”,要使DDL SQL显示在日志中,还应在
    application.properties
    中包含
    logging.level.org.hibernate.tool.hbm2ddl=DEBUG
    ,否则这些日志将永远不会显示。请注意,这只允许与架构更新相关的调试日志,而不是所有可能导致控制台溢出的日志。IMHO提供了比这更好的解决方案。