2015-11-04 67 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 
相關問題