H2 JdbcSQLException: "Table not found" with camelcase table & entity name

H2 JdbcSQLException: "Table not found" with camelcase table & entity name

使用 Spring 引导,使用 Spring Data JPA 和 H2 内存数据库(在 PostgreSQL 模式下,如果它有所不同)。

我有一个名为 ContentBlock 的 table & 实体 class,但是当我执行 findAll()findOne():

org.h2.jdbc.JdbcSQLException: Table "CONTENT_BLOCK" not found

我不确定 uppercase/camelcase 是否有所不同,但是 CONTENT_BLOCK 中的下划线从何而来?

在我的架构定义中:

CREATE TABLE ContentBlock (
  id       BIGSERIAL PRIMARY KEY,
  content  TEXT
  -- etc
);

并且在实体中 class:

@Entity
@Table(name = "ContentBlock")
public class ContentBlock {
    // ...
}

(当然,我首先尝试没有 @Table 注释,因为 class 名称与 table 名称完全匹配。)

我的另一个 tables/entities,名称如 Asset,没有问题,我不需要在 Java 上明确指定 table 名称边:

@Entity   
public class Asset {
    // ...
}

在我的设置中,H2 数据源明确定义如下:

@Bean
public DataSource devDataSource() {  
        return new EmbeddedDatabaseBuilder()
          .generateUniqueName(true)
          .setType(EmbeddedDatabaseType.H2)
          .setScriptEncoding("UTF-8")
          .ignoreFailedDrops(true)
          .addScripts("database/init.sql", "database/schema.sql", "database/test_data.sql")
          .build();
    }

init.sql 的内容是 SET MODE PostgreSQL;

作为解决方法,我只是将 ContentBlock table 重命名为 schema.sql 中的 Block,Java [=] 中的 @Table(name = "Block") 59=],我仍然称之为 ContentBlock

但这很奇怪,你确定你能以某种方式将驼峰命名的 table 映射到实体吗?

默认情况下 Spring Boot 使用 SpringNamingStrategy。它从 Hibernate 4 扩展 org.hibernate.cfg.ImprovedNamingStrategyImprovedNamingStrategy 在 table 名称中生成下划线。

要将驼峰命名的 table 映射到实体,您可以使用 org.hibernate.cfg.EJB3NamingStrategy 或实现自己的实体。

使用属性设置名称策略的示例

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy