32

I have a Spring Boot 2.5.0 project. I'm using Spring Data JPA with the H2 in-memory database. I want to populate data on startup with a data.sql file but I'm getting a table not found exception. If I remove the data.sql file, I can see that a table for my entity does get created automatically. But if I include the data.sql file, I get the error saying the table doesn't exist. Maybe it is an error with my sql syntax of I have misconfigured the H2 database?

applicaltion.yml

spring:
  datasource:
    url: jdbc:h2:mem:test
    driverClassName: org.h2.Driver
    username: sa
    password: sa
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect

debug: true  

data.sql

INSERT INTO BUSINESS_SUMMARY VALUES (1, "ALM470", "B48", 3);

BusinessSummary.java entity

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class BusinessSummary {

    @Id
    private Long id;
    private String businessId;
    private String businessDomainId;
    private Integer cityCode;
}

BusinessSummaryRepository.java

@Repository
public interface BusinessSummaryRepository extends JpaRepository<BusinessSummary, Long> {
}

Exception:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "BUSINESS_SUMMARY" not found; SQL statement:
INSERT INTO BUSINESS_SUMMARY VALUES(1, "ALM470", "B48", 3) [42102-200]

4 Answers 4

67
spring.jpa.defer-datasource-initialization=true

By default, data.sql scripts are now run before Hibernate is initialized. This aligns the behavior of basic script-based initialization with that of Flyway and Liquibase.

If you want to use data.sql to populate a schema created by Hibernate, set spring.jpa.defer-datasource-initialization to true. While mixing database initialization technologies is not recommended, this will also allow you to use a schema.sql script to build upon a Hibernate-created schema before it’s populated via data.sql.

you'll have to convert spring.jpa.defer-datasource-initialization to yml.

Sign up to request clarification or add additional context in comments.

6 Comments

Good grief. I literally spent 2 solid weeks on this. I finally gave up in disgust and starting writing @BeforeEach code blocks on all unit tests to populate the H2 database with data because loading data.sql always resulted in 'TABLE <> NOT FOUND' errors. Hours and hours of frustration. This was the ticket: spring.jpa.defer-datasource-initialization=true Thank you so much!
this is very important to know , was stuck for days
Was scratching my head after bumping my spring boot version
This works perfectly fine. What also worked for me was to rename data.sql to import.sql (no idea why even without adding spring.jpa.defer-datasource-initialization)
By default, data.sql and schema.sql both run before Hibernate. say, if you have a sequence start with 1000 in schema.sql, which is different from your default sequence start in entity class, without putting "spring.jpa.defer-datasource-initialization" in application.yml, sequence start with 1000 will be used.
|
14

If you're using hibernate as a JPA implementation, the best way I think is by using the file import.sql instead of data.sql for Database Initialization.

for more information on database initialization see the official Spring Boot documentation Database Initialization

Comments

0

in addition to defer-datasource-initialization: true, you may also need

spring:
  sql:
    init:
      mode: always

Comments

0
spring.jpa.defer-datasource-initialization = true    
spring.sql.init.mode = always

if still doesn`t work try renaming the file from data.sql to import.sql

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.