Sping Boot Data JPA with H2 and data.sql -未找到表

falq053o  于 2023-10-20  发布在  Spring
关注(0)|答案(4)|浏览(155)

我有一个Spring Boot2.5.0项目。我使用Spring Data JPAH2in-memory 数据库。我想在启动时用data.sql文件填充数据,但我得到了一个未找到表的异常。如果删除data.sql文件,可以看到实体的表会自动创建。但是如果我包含data.sql文件,我会得到错误消息,说表不存在。也许是我的sql语法错误,我错误地配置了H2数据库?

  • 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实体 *
@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> {
}
  • 例外情况:*
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "BUSINESS_SUMMARY" not found; SQL statement:
INSERT INTO BUSINESS_SUMMARY VALUES(1, "ALM470", "B48", 3) [42102-200]
fcy6dtqo

fcy6dtqo1#

spring.jpa.defer-datasource-initialization=true

默认情况下,data.sql脚本现在在Hibernate初始化之前运行。这使基于脚本的基本初始化行为与FlywayLiquibase的行为保持一致。
如果要使用data.sql填充由Hibernate创建的模式,请将spring.jpa. defer-configuration-initialization设置为true。虽然不建议混合使用数据库初始化技术,但这也允许您在通过data.sql填充Hibernate创建的模式之前,使用schema.sql脚本在该模式上进行构建。
你必须将spring.jpa.defer-datasource-initialization转换为yml。

col17t5w

col17t5w2#

如果您使用hibernate作为JPA实现,我认为最好的方法是使用文件import.sql而不是data.sql作为数据库接口。
有关数据库初始化的更多信息,请参阅官方Sping Boot 文档数据库初始化

axkjgtzd

axkjgtzd3#

除了延迟初始化之外:真的,你可能还需要

spring:
  sql:
    init:
      mode: always
6kkfgxo0

6kkfgxo04#

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

如果仍然不工作尝试重命名文件从data.sql到import.sql

相关问题