使用Spring Boot,使用Spring Data JPA和H2内存数据库(在PostgreSQL模式下如果有差异)。H2 JdbcSQLException:使用camelcase表和实体名称的“表未找到”
我有一个名为ContentBlock
表&实体类,但H2抱怨缺少CONTENT_BLOCK
表,当我做了findAll()
或findOne()
:
org.h2.jdbc.JdbcSQLException: Table "CONTENT_BLOCK" not found
我不知道如果是大写/驼峰有差别,但是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数据源的明确定义是这样的:
(的init.sql
内容是SET MODE PostgreSQL;
)
至于解决方法,我只是改名为ContentBlock
表到Block
的schema.sql
,与@Table(name = "Block")
在Java类,我仍然叫ContentBlock
。
但是,这很奇怪,当然你可以用camelcase名称映射到某个实体?
在现实中还有其他列,以及,如外键引用另一个表,但在这里不是一个初步认识名牌战略的一个例子;我可以用上面的简单设置重现这个问题。 – Jonik
也许会在名称周围添加(单个)引号?也许值得一试。有些RDBMS使用引号作为区分大小写的方法 –
@NeilStockton:嗯,在CREATE TABLE语句中使用单引号会产生语法错误,但使用双引号时,我实际上会得到“Table”CONTENTBLOCK“not found”(没有下划线!) ,所以你可能会在这里。 – Jonik