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