我可以清楚地看到pgAdmin在公共方案中存在表“TEST”。
这是我的配置:
@Entity
@Table(name = "TEST", schema = "public")
public class TestEntity
application.yml:
spring:
jpa:
hibernate:
ddl-auto: validate
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
databasePlatform: org.hibernate.dialect.PostgreSQLDialect
例外:
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [TEST]
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:67)
当我将ddl-auto更改为'update'时,它会创建具有“test”名称的表,并且一切都按预期开始工作。问题是我认为我的配置很好,它应该找到“TEST”。有人可以帮忙吗?也许我需要使用更具体的方言?
当然,原因在于命名策略。
@Table(name = "TEST")
只有PhysicalNamingStrategy
可以改变它(对面ImplicitNamingStrategy
)。SpringPhysicalNamingStrategy
将名称更改为小写,您可以从以下来源中看到:SpringPhysicalNamingStrategy.java。那里的代码片段:
protected Identifier getIdentifier(String name, boolean quoted,
JdbcEnvironment jdbcEnvironment) {
if (isCaseInsensitive(jdbcEnvironment)) {
name = name.toLowerCase(Locale.ROOT);
}
return new Identifier(name, quoted);
}
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
什么都不做。所以表名应该是你指定的TEST
。但是,看起来,你在spring-boot
配置中错误地指定了它。您应该仔细检查属性名称。另外,只是为了测试,你可以尝试使用application.properties
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl