sourcecode

스프링 부팅 및 최대 절전 모드: DDL 인쇄/로그

codebag 2023. 7. 7. 19:01
반응형

스프링 부팅 및 최대 절전 모드: DDL 인쇄/로그

데이터베이스 매핑(JPA/hibernate)이 포함된 클래스를 하나 이상 추가한 후, FlyWay 등을 통해 데이터베이스에서 실행할 수 있도록 Hibernate에서 필요한 스키마 업데이트를 인쇄하려고 합니다.업데이트가 자동으로 실행되지 않도록 합니다.

이를 제어할 수 있는 유일한 속성은 다음과 같습니다.

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

아무것도 자동으로 업데이트/변경하지 않습니다.유효성 확인 또는 없음으로 설정합니다.이렇게 하면 생성된 스키마가 표시되지 않습니다.

나는 고전적인 봄 응용 프로그램, 나는 겨울잠을 사용했습니다.SchemaExportDDL을 인쇄할 클래스입니다.

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

스프링 부츠에서 사용할 수 있는 비슷한 것이 있습니까?

이게 내가 하는 일...

먼저 엔티티를 변경한 후 다음과 같이 설정합니다.

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

그리고나서

  1. 앱을 다시 실행하고 최대 절전 모드에서 데이터베이스를 변경하도록 합니다.
  2. 로그로 이동하여 DB 업데이트에 사용된 최대 절전 모드 SQL을 복사합니다.
  3. 해당 SQL을 새 Flyway 스크립트에 붙여넣습니다.
  4. 슈다운 부트 앱
  5. 로컬 데이터베이스 삭제
  6. ddl-auto를 다시 유효성 검사로 변경
  7. 부팅 앱 다시 시작
  8. Flyway가 올바른 업데이트를 수행했는지 테스트합니다.이제 최대 절전 모드와 Flyway가 동기화됩니다.

디버깅을 켜도 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가 제안한 대로 계속 진행할 수 있습니다.

언급URL : https://stackoverflow.com/questions/25048199/spring-boot-and-hibernate-print-log-ddl

반응형