반응형
스프링 부팅 및 최대 절전 모드: DDL 인쇄/로그
데이터베이스 매핑(JPA/hibernate)이 포함된 클래스를 하나 이상 추가한 후, FlyWay 등을 통해 데이터베이스에서 실행할 수 있도록 Hibernate에서 필요한 스키마 업데이트를 인쇄하려고 합니다.업데이트가 자동으로 실행되지 않도록 합니다.
이를 제어할 수 있는 유일한 속성은 다음과 같습니다.
org.hibernate.tool.hbm2ddl=validate|update|create|create-drop|none
아무것도 자동으로 업데이트/변경하지 않습니다.유효성 확인 또는 없음으로 설정합니다.이렇게 하면 생성된 스키마가 표시되지 않습니다.
나는 고전적인 봄 응용 프로그램, 나는 겨울잠을 사용했습니다.SchemaExport
DDL을 인쇄할 클래스입니다.
SchemaExport schemaExport = new SchemaExport(cfg);
schemaExport.execute(true, false, false, false);
스프링 부츠에서 사용할 수 있는 비슷한 것이 있습니까?
이게 내가 하는 일...
먼저 엔티티를 변경한 후 다음과 같이 설정합니다.
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
그리고나서
- 앱을 다시 실행하고 최대 절전 모드에서 데이터베이스를 변경하도록 합니다.
- 로그로 이동하여 DB 업데이트에 사용된 최대 절전 모드 SQL을 복사합니다.
- 해당 SQL을 새 Flyway 스크립트에 붙여넣습니다.
- 슈다운 부트 앱
- 로컬 데이터베이스 삭제
- ddl-auto를 다시 유효성 검사로 변경
- 부팅 앱 다시 시작
- 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
반응형
'sourcecode' 카테고리의 다른 글
부트스트랩 양식에 두 필드를 나란히 표시 (0) | 2023.07.07 |
---|---|
커밋, 커밋 및 푸시, 커밋 및 동기화의 차이점 (0) | 2023.07.07 |
XPath 네임스페이스가 있는 노드 선택 (0) | 2023.07.07 |
Spring Boot - /health 끝점의 위치를 /ping/me로 변경합니다. (0) | 2023.07.07 |
GeoFire를 Firestore와 함께 사용할 수 있는 방법이 있습니까? (0) | 2023.07.07 |