Home > Blockchain >  Spring Boot - Loading Initial Data to Database
Spring Boot - Loading Initial Data to Database

Time:01-04

I have a little problem. I have a Spring Boot Application and I will fill my H2 database with data. But I can not load the initial database data from the data-h2.sql file.

Model:

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "mood")
public class Mood {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "mood_id")
    private int id;

    @Column(name = "name")
    private String name;

    public Mood(String name) {
        this.name = name;
    }

    public Mood(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

data-h2.sql file: INSERT INTO mood (name) VALUES ('Good');

application.properties:

spring.datasource.url=jdbc:h2:mem:mooddb;
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=a
spring.datasource.password=a
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create

spring.h2.console.enabled=true

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

spring.jpa.defer-datasource-initialization=true

spring.h2.console.path=/h2-console
spring.h2.console.settings.trace=false
spring.h2.console.settings.web-allow-others=false```

Sorry for the formatation, that is my first question :)

CodePudding user response:

The problem is that spring expects to find a file with either the name schema.sql or data.sql in the classpath to load.

But your file is named data-h2.sql so spring will not consider it, even if it is correctly placed in resources.

There are 2 solutions:

  1. Rename the file into data.sql and be sure it is inside the resources folder

  2. Do not rename the file and use the following application property to inform spring about the name of the file that it should load spring.sql.init.data-locations=classpath:data-h2.sql

CodePudding user response:

The How-To guide is this.

And the property is named:

spring.sql.init.platform=h2

Spring Boot can automatically create the schema (DDL scripts) of your JDBC DataSource or R2DBC ConnectionFactory and initialize it (DML scripts). It loads SQL from the standard root classpath locations: schema.sql and data.sql, respectively. In addition, Spring Boot processes the schema-${platform}.sql and data-${platform}.sql files (if present), where platform is the value of spring.sql.init.platform. This allows you to switch to database-specific scripts if necessary. For example, you might choose to set it to the vendor name of the database (hsqldb, h2, oracle, mysql, postgresql, and so on). By default, SQL database initialization is only performed when using an embedded in-memory database. ...


 spring.jpa.defer-datasource-initialization=true

... on the other hand:

This will defer data source initialization until after any EntityManagerFactory beans have been created and initialized. schema.sql can then be used to make additions to any schema creation performed by Hibernate and data.sql can be used to populate it.

(Manually with EnitityManager, as I understand)


Please also consider:

It is recommended to use a single mechanism for schema generation.

(So, not hibernate scripts ( migration tool)!)


And:

Spring Boot supports two higher-level migration tools: Flyway and Liquibase.


A common pattern (for DDL) is:

  1. To generate/log DDL scripts with hibernate/jpa (e.g. when new entities evolve)
  2. To use these in flyway/liquibase.

CodePudding user response:

Thank you. I renamed the file.

  •  Tags:  
  • Related