带有 H2 和 data.sql 的 Spring Boot Data JPA - 未找到表

Posted

技术标签:

【中文标题】带有 H2 和 data.sql 的 Spring Boot Data JPA - 未找到表【英文标题】:Spring Boot Data JPA with H2 and data.sql - Table not Found 【发布时间】:2021-08-17 01:07:55 【问题描述】:

我有一个 Spring Boot 2.5.0 项目。我将 spring-data-jap 与 h2 内存数据库一起使用。我想在启动时使用 data.sql 文件填充数据,但我得到了一个找不到表的异常。如果我删除 data.sql 文件,我可以看到我的实体的表确实是自动创建的。但是,如果我包含 data.sql 文件,则会收到错误消息,指出该表不存在。也许是我的 sql 语法错误,我错误配置了 h2 数据库?

应用程序.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]

【问题讨论】:

【参考方案1】:
spring.jpa.defer-datasource-initialization=true

默认情况下,data.sql 脚本现在在 Hibernate 之前运行 初始化。这对齐了基本基于脚本的行为 使用 Flyway 和 Liquibase 进行初始化。

如果你想使用 data.sql 填充由 Hibernate 创建的模式,设置 spring.jpa.defer-datasource-initialization 为 true。混合时 不推荐使用数据库初始化技术,这将 还允许您使用 schema.sql 脚本来构建 在通过 data.sql 填充之前由 Hibernate 创建的架构。

您必须将 spring.jpa.defer-datasource-initialization 转换为 yml。

【讨论】:

好悲痛。我真的在这上面花了整整两周的时间。我最终厌恶地放弃了,并开始在所有单元测试中编写 @BeforeEach 代码块来用数据填充 H2 数据库,因为加载 data.sql 总是会导致“TABLE NOT FOUND”错误。数小时和数小时的沮丧。这是票:spring.jpa.defer-datasource-initialization=true 非常感谢! 这点很重要,被卡了好几天 在撞到我的弹簧靴版本后挠头 这工作得很好。对我也有用的是将 data.sql 重命名为 import.sql (不知道为什么即使没有添加 spring.jpa.defer-datasource-initialization)【参考方案2】:

如果您使用 hibernate 作为 JPA 实现,我认为最好的方法是使用文件 import.sql 而不是 data.sql 进行数据库初始化。

有关数据库初始化的更多信息,请参阅 Spring Boot 官方文档Database Initialization

【讨论】:

以上是关于带有 H2 和 data.sql 的 Spring Boot Data JPA - 未找到表的主要内容,如果未能解决你的问题,请参考以下文章

在spring boot中进行单元测试之前,通过data.sql文件向h2数据库中插入数据

如何为 Spring Boot 应用程序外部化 data.sql

内存数据库H2中的Spring Boot在初始化时不会从文件中加载数据

带有spring boot JPA Postgresql的data.sql未加载

为啥带有嵌入式 H2 的 Spring Boot 会抛出“org.h2.message.DbException”错误?

Spring-Boot 仅在一个配置文件中执行 data.sql