H2 JdbcSQLException:“找不到表”与camelcase table&实体名称

时间:2015-11-04 10:37:07

标签: spring hibernate jpa spring-data-jpa h2

使用Spring Boot,使用Spring Data JPA和H2内存数据库(如果它有所不同,则采用PostgreSQL模式)。

我有一张桌子和一张桌子。名为ContentBlock的实体类,但当我执行CONTENT_BLOCKfindAll()时,H2会抱怨缺少findOne()表:

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

我不确定大写/ camelcase是否有所作为,但CONTENT_BLOCK中的下划线来自何处?

在我的架构定义中:

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

在实体类中:

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

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

使用我的其他表/实体,名称如Asset,没有问题,我不需要在Java端显式指定表名:

@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中将Block表重命名为schema.sql,并在Java类中使用@Table(name = "Block"),我仍称之为ContentBlock

但这很奇怪,肯定你可以用某种方式将一个带有camelcase名称的表映射到一个实体?

1 个答案:

答案 0 :(得分:1)

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

要将具有驼峰案例名称的表映射到实体,您可以使用org.hibernate.cfg.EJB3NamingStrategy或实现自己的实体。

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

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