programing

데이터에 대한 Spring Boot 데이터 원본 초기화 오류가 발생했습니다.2.5.0 업그레이드 후 sql 스크립트

megabox 2023. 6. 23. 21:51
반응형

데이터에 대한 Spring Boot 데이터 원본 초기화 오류가 발생했습니다.2.5.0 업그레이드 후 sql 스크립트

Spring Boot 및 Spring Data JPA로 구성된 프로젝트가 있습니다.

과 같은 프로젝트가 되어 있습니다.data.sql초기화 스크립트(애플리케이션 개발을 막 시작하여 내장 H2 데이터베이스를 사용하게 되었습니다.):

INSERT INTO Project(id, name) VALUES (1, 'Project 1');

그리고 저는 다음과 같은 실체를 정의하고 있습니다.

@Entity
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    protected Project() {
    }

    public Project(String name) {
        this.name = name;
    }
    // ...
}

다른 구성/설정이 없습니다.

ERROR 5520 ---[  restartedMain] o.s.boot.SpringApplication               :Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/C:/path/project/target/classes/data.sql]: INSERT INTO Project(id, name) VALUES (1, 'Project 1'); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "PROJECT" not found; SQL statement:
INSERT INTO Project(id, name) VALUES (1, 'Project 1') [42102-200]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)
...
Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/C:/path/project/target/classes/data.sql]: INSERT INTO Project(id, name) VALUES (1, 'Project 1'); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "PROJECT" not found; SQL statement:
INSERT INTO Project(id, name) VALUES (1, 'Project 1') [42102-200]
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:622)
    at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:254)
...
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "PROJECT" not found; SQL statement:
INSERT INTO Project(id, name) VALUES (1, 'Project 1') [42102-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:453)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)

물론 업그레이드 전에는 애플리케이션이 제대로 시작되었습니다.

TL;DR

Spring Boot은 SQL 스크립트를 사용하여 데이터 소스를 초기화하는 방법을 수정한 것 같습니다.2.5.0.

이 문제는 프로젝트에 다음 속성을 포함하여 해결할 수 있습니다.

spring:
  jpa:
    defer-datasource-initialization: true

설명:

변개항중에 된 변경 2.5.0은 는제이로 .data.sql최대 절전 모드가 초기화되기 전에 스크립트가 실행됩니다.

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.5-Release-Notes#hibernate-and-datasql

또한 ORM 메커니즘(즉, 최대 절전 모드)을 사용하여 엔티티 정의에서 스키마를 생성하므로 초기화 SQL 스크립트가 실행되는 순간 데이터베이스 테이블이 존재하지 않습니다.

Add "spring.jpa.defer-datasource-initialization = true" to application.properties file.

이유: 기본적으로 데이터입니다.이제 최대 절전 모드가 초기화되기 전에 sql 스크립트가 실행됩니다.이것은 기본 스크립트 기반 초기화 동작을 Flyway 및 Liquibase 동작과 일치시킵니다.데이터를 사용하고자 하는 경우.sql을 사용하여 Hibernate에서 만든 스키마를 채우려면 spring.jpa.defer-data source-initialization을 true로 설정합니다.데이터베이스 초기화 기술을 혼합하는 것은 권장되지 않지만 스키마를 사용할 수도 있습니다.sql 스크립트는 data.sql을 통해 채워지기 전에 Hibernate에서 생성된 스키마를 기반으로 합니다.

출처: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.5-Release-Notes#hibernate-and-datasql

누군가에게 도움이 되길 바랍니다.저도 같은 문제가 있었습니다. 제 data.sql 파일이 선택되지 않아서 빈 테이블만 생성되었습니다.나는 아래에 언급된 속성을 사용했고 그것은 나에게 효과가 있었습니다.

    spring.sql.init.mode=always
    spring.datasource.url= jdbc:mysql://${MYSQL_CONTAINER_NAME:localhost}:3306/${MYSQL_DATABASE:uber}
    spring.datasource.username=${MYSQL_USER:boca-user}
    spring.datasource.password=${MYSQL_PASSWORD:boca-password}
    spring.datasource.initialization-mode=always
    spring.jpa.show-sql=true
    spring.jpa.defer-datasource-initialization = true
    spring.jpa.hibernate.ddl-auto=update

한후 ORM을 통해 수 .data.sql

이를 위해 다른 속성도 필요합니다.spring.sql.init.mode: always

관련 자산의 총 집합은 다음과 같습니다.

spring:
  sql.init.mode: always
  datasource:
    url: jdbc:postgresql://localhost:5432/products
    username: 
    password: 
  jpa:
    defer-datasource-initialization: true
    hibernate:
      ddl-auto: create-drop
    database-platform: org.hibernate.dialect.PostgreSQLDialect

데이터를 사용하고자 하는 경우.sql을 사용하여 Hibernate에서 만든 스키마를 채우려면 spring.jpa.defer-data source-initialization을 true로 설정합니다.

data.sql OR schema.sql 파일을 main/resources에 저장해야 합니다.

Spring Boot 버전 2+에는 약간의 변경 사항이 있습니다.모든 DDL(데이터 정의 언어) - 테이블 작성 및 데이터 업데이트는 스키마에서 수행해야 합니다.sql

이 문제를 해결하려면 이 항목을 추가하고 데이터를 사용하십시오.sql 또는 스키마.테이블이 H2 데이터베이스에 생성되기 전에 sql이 실행되고 있으므로 지연시키고 싶습니다. 그래서 이 속성을 사용합니다.'

spring.jpa.defer-datasource-initialization = true

application.properties 구성 파일로 이동합니다.

또는

spring:
  jpa:
    defer-datasource-initialization: true

application.yml Configuration 파일에 yml을 사용하는 경우 위의 내용을 추가합니다.

H2 In 메모리 구성의 예

spring.jpa.defer-datasource-initialization = true
spring.h2.console.enabled=true
spring.sql.init.platform=h2
spring.datasource.url=jdbc:h2:mem:todo
spring.datasource.username=sa
spring.datasource.password=

CREATE TABLE 끝에 세미콜론(;)을 잊어 스프링 부트 응용 프로그램을 실행할 때 SQL 구문 오류가 발생할 수 있으며, 때로는 SYSDATE() 및 NOW()가 현재 날짜에 NOW()를 사용하는 데 문제가 있으므로 DDL 또는 DML에 대한 올바른 SQL 구문을 작성해야 합니다.

비슷한 문제에 직면했는데 방금 @Entity(name="table_name")를 추가했는데 오류가 해결되었습니다.

application.properties 파일 내용:

spring.sql.init.mode=always
spring.jpa.defer-datasource-initialization = true
spring.h2.console.enabled=true
spring.sql.init.platform=h2
spring.datasource.url=jdbc:h2:mem:ToDo
spring.datasource.username=sa
spring.datasource.password=

schema.sql 파일을 정의해 보십시오. 데이터보다 먼저 실행됩니다.sql

언급URL : https://stackoverflow.com/questions/67695069/spring-boot-datasource-initialization-error-with-data-sql-script-after-2-5-0-upg

반응형