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.ImprovedNamingStrategy
。ImprovedNamingStrategy
在 table 名称中生成下划线。
要将驼峰命名的 table 映射到实体,您可以使用 org.hibernate.cfg.EJB3NamingStrategy
或实现自己的实体。
使用属性设置名称策略的示例
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
使用 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.ImprovedNamingStrategy
。ImprovedNamingStrategy
在 table 名称中生成下划线。
要将驼峰命名的 table 映射到实体,您可以使用 org.hibernate.cfg.EJB3NamingStrategy
或实现自己的实体。
使用属性设置名称策略的示例
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy