2017-12-17 1 views
3

Ich kann mit pgAdmin klar sehen, dass die Tabelle "TEST" innerhalb des öffentlichen Schemas existiert.Tabelle nicht gefunden - falsche Benennungsstrategie?

Hier ist meine Konfiguration:

@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 

Ausnahme:

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [TEST] 
     at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:67) 

Wenn ich DDL-Auto zu 'update' es schafft Tabelle zu ändern mit "Test" Name und alles beginnt wie erwartet zu arbeiten. Das Problem ist, dass ich denke, meine Konfiguration ist in Ordnung und es sollte "TEST" finden. Kann jemand helfen? Vielleicht muss ich einen spezifischeren Dialekt verwenden?

+0

Aus meiner Erfahrung zu verwenden, werden solche Fehler zu Datenquellendefinition in Anwendung yaml bezogen, wenn Ihr Schema in Ordnung ist. – garfield

Antwort

0

Ich weiß nicht, Ihre hibernate Version Ich denke, das könnte hibernate Feature zum Beispiel beschrieben werden here.

In diesem Fall ist die Lösung für Tabellenname

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

zu

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

in Kleinbuchstaben zu ändern, wie here vorgeschlagen.

Abhängig von Ihrer Datenbank kann es auch möglich sein, dass die zu erstellende Tabelle UPPERCASE hat, indem Sie sie mit doppelten Escapezeichen umschließen.

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

Letzteres funktioniert zumindest mit Postgres.

1

Der Grund ist natürlich eine Benennungsstrategie.

  1. Wenn Sie einen Tabellennamen explizit angeben, wie hier @Table(name = "TEST") nur PhysicalNamingStrategy es (gegenüber ImplicitNamingStrategy) ändern können.
  2. SpringPhysicalNamingStrategy ändert Namen in Kleinbuchstaben, wie Sie aus den Quellen sehen können: SpringPhysicalNamingStrategy.java. Ein Code-Snippet von dort:

    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 tut nichts. Daher sollte der Tabellenname wie von Ihnen angegeben TEST sein. Aber sieht so aus, Sie haben es in der spring-boot Konfiguration falsch angegeben. Sie sollten den Eigenschaftsnamen überprüfen.

  4. Sie können auch andere Eigenschaftendateien (möglicherweise haben Sie andere JAR) für diesen Eigenschaftswert überprüfen.

Auch nur zu testen, können Sie versuchen, application.properties mit

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

Verwandte Themen