75.3 Initialize a database using Spring JDBC
Spring JDBC has a DataSource
initializer feature. Spring Boot enables it by default and loads SQL from the standard locations schema.sql
and data.sql
(in the root of the classpath). In addition Spring Boot will load the schema-${platform}.sql
and data-${platform}.sql
files (if present), where platform
is the value of spring.datasource.platform
, e.g. you might choose to set it to the vendor name of the database (hsqldb
, h2
, oracle
, mysql
, postgresql
etc.). Spring Boot enables the fail-fast feature of the Spring JDBC initializer by default, so if the scripts cause exceptions the application will fail to start. The script locations can be changed by setting spring.datasource.schema
and spring.datasource.data
, and neither location will be processed if spring.datasource.initialize=false
.
To disable the fail-fast you can set spring.datasource.continue-on-error=true
. This can be useful once an application has matured and been deployed a few times, since the scripts can act as ‘poor man’s migrations’ — inserts that fail mean that the data is already there, so there would be no need to prevent the application from running, for instance.
If you want to use the schema.sql
initialization in a JPA app (with Hibernate) then ddl-auto=create-drop
will lead to errors if Hibernate tries to create the same tables. To avoid those errors set ddl-auto
explicitly to "" (preferable) or "none". Whether or not you use ddl-auto=create-drop
you can always use data.sql
to initialize new data.