데이터에 대한 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 |