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

时间:2017-12-17 15:12:39

标签: spring hibernate jpa spring-boot

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

2 个答案:

答案 0 :(得分: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)。
  5. 另外,只是为了测试,您可以尝试将application.properties

    一起使用

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

答案 1 :(得分:0)

不知道您的import os import re import csv pattern = "^[A-Za-z]*[,]$" file1 = open("10000DirtyNames.csv", "r") print(re.match(pattern, file1)) if (re.match(pattern, file1)) != None: print("Match") else: print("Does not match") file1.close() 版本我想这可能是hibernate功能,例如here

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

hibernate

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

建议here

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

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

Latter至少与Postgres合作。