如何在生成数据库模式之后但在应用程序启动之前执行sql脚本

时间:2017-05-31 15:55:20

标签: java hibernate spring-boot ddl flyway

我想从我的Java类生成数据库结构

jpa.generate-ddl: true
jpa.ddl-auto: true

此外,我需要在应用程序启动之前运行SQL脚本,因为我使用@PostConstruct方法来使用这些数据。

你能举例说明如何在Spring Boot中做到这一点吗?

2 个答案:

答案 0 :(得分:0)

可以在以下位置找到具有所需功能的简单弹簧启动应用程序。 https://github.com/salilotr89/Spring-boot-postgres-dbinit

Spring JDBC具有DataSource初始化程序功能。 Spring Boot默认启用它并从标准位置 schema.sql data.sql(在类路径的根目录中)加载SQL。

此外,Spring Boot将加载架构 - $ {platform} .sql data - $ {platform} .sql 文件(如果存在),其中platform是spring.datasource.platform的值,例如您可以选择将其设置为数据库的供应商名称(hsqldb,h2,oracle,mysql,postgresql等)。

Spring Boot默认启用Spring JDBC初始化程序的快速失败功能,因此如果脚本导致异常,则应用程序将无法启动。可以通过设置spring.datasource.schema和spring.datasource.data来更改脚本位置,如果 spring.datasource.initialize = false ,则不会处理任何位置。

要禁用快速失败,可以设置spring.datasource.continue-on-error = true。一旦应用程序成熟并部署了几次,这可能很有用,因为脚本可以充当“穷人的迁移” - 插入失败意味着数据已经存在,因此不需要阻止应用程序例如,跑步。

如果要在JPA应用程序(使用Hibernate)中使用schema.sql初始化,那么如果Hibernate尝试创建相同的表,则ddl-auto = create-drop将导致错误。为避免这些错误,请将ddl-auto明确设置为“”(首选)或“无”。无论您是否使用ddl-auto = create-drop,都可以使用data.sql初始化新数据。

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

供参考:Spring Boot - Loading Initial Data

答案 1 :(得分:0)

您需要做的就是将一个名为 data.sql 的文件放在application.properties文件所在的资源文件夹中。

此文件中的任何查询都将在应用程序启动之前和创建数据库之后执行。

要了解更多信息,请查看此链接 http://www.baeldung.com/spring-boot-data-sql-and-schema-sql