找不到表 - 错误的命名策略?

问题描述 投票:4回答:2

我可以清楚地看到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”。有人可以帮忙吗?也许我需要使用更具体的方言?

spring hibernate jpa spring-boot
2个回答
2
投票

当然,原因在于命名策略。

  1. 当您明确指定表名时,像这里@Table(name = "TEST")只有PhysicalNamingStrategy可以改变它(对面ImplicitNamingStrategy)。
  2. 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); }
  3. org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl什么都不做。所以表名应该是你指定的TEST。但是,看起来,你在spring-boot配置中错误地指定了它。您应该仔细检查属性名称。
  4. 您还可以检查该属性值的其他属性文件(可能是您有其他jar)。

另外,只是为了测试,你可以尝试使用application.properties

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl


0
投票

不知道你的hibernate版本我想这可能是hibernate功能描述为例如here

在这种情况下,解决方案是将表名更改为小写

@Table(name = "TEST", schema = "public")

@Table(name = "test", schema = "public")

正如建议的here

根据您的数据库,也可以通过使用转义双引号将其包装来创建表大写。

@Table(name = "\"TEST\"", schema = "public")

后者至少与Postgres合作。

© www.soinside.com 2019 - 2024. All rights reserved.