데이터에 대한 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최대 절전 모드가 초기화되기 전에 스크립트가 실행됩니다.
또한 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
'programing' 카테고리의 다른 글
| PHP / MongogeoJSON 루프가 잘못되었습니다. (0) | 2023.06.23 |
|---|---|
| 신뢰할 수 있는 연결이란? (0) | 2023.06.23 |
| 드롭 테이블 문 mysql에서 변수를 사용하는 방법은 무엇입니까? (0) | 2023.06.18 |
| 특정 텍스트를 포함하는 요소에 대한 CSS 선택기가 있습니까? (0) | 2023.06.18 |
| python의 멀티프로세싱 풀에서 키보드 인터럽트 (0) | 2023.06.18 |