2015-11-04 39 views
2

使用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表到Blockschema.sql,与@Table(name = "Block")在Java类,我仍然叫ContentBlock

但是,这很奇怪,当然你可以用camelcase名称映射到某个实体?

+0

在现实中还有其他列,以及,如外键引用另一个表,但在这里不是一个初步认识名牌战略的一个例子;我可以用上面的简单设置重现这个问题。 – Jonik

+0

也许会在名称周围添加(单个)引号?也许值得一试。有些RDBMS使用引号作为区分大小写的方法 –

+0

@NeilStockton:嗯,在CREATE TABLE语句中使用单引号会产生语法错误,但使用双引号时,我实际上会得到“Table”CONTENTBLOCK“not found”(没有下划线!) ,所以你可能会在这里。 – Jonik

回答

1

默认情况下Spring Boot使用SpringNamingStrategy。它从休眠4延伸org.hibernate.cfg.ImprovedNamingStrategyImprovedNamingStrategy在表名中生成下划线。

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

的设置使用属性

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy 
相关问题