使用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