使用Spring Boot,使用Spring Data JPA和H2内存数据库(如果它有所不同,则采用PostgreSQL模式)。
我有一张桌子和一张桌子。名为ContentBlock
的实体类,但当我执行CONTENT_BLOCK
或findAll()
时,H2会抱怨缺少findOne()
表:
org.h2.jdbc.JdbcSQLException: Table "CONTENT_BLOCK" not found
我不确定大写/ camelcase是否有所作为,但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数据源明确定义如下:
@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
中将Block
表重命名为schema.sql
,并在Java类中使用@Table(name = "Block")
,我仍称之为ContentBlock
。
但这很奇怪,肯定你可以用某种方式将一个带有camelcase名称的表映射到一个实体?
答案 0 :(得分:1)
默认Spring Boot
使用SpringNamingStrategy。它从Hibernate 4扩展org.hibernate.cfg.ImprovedNamingStrategy
。ImprovedNamingStrategy
在表名中生成下划线。
要将具有驼峰案例名称的表映射到实体,您可以使用org.hibernate.cfg.EJB3NamingStrategy
或实现自己的实体。
使用属性设置名称策略的示例
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy