PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Fehlende Tabelle in materialisierter Ansicht

Ich habe seit einigen Tagen den gleichen Fehler. Als diese Antwort gesagt, es ist möglich, hibernate.hbm2ddl.auto zu deaktivieren -Eigenschaft in Ihrer persistence.xml , aber es ist keine gute Idee, wenn sich Ihr Projekt schnell entwickelt.

TL;DR: Setzen Sie die Eigenschaft hibernate.hbm2dll.extra_physical_table_types zu MATERIALIZED VIEW .

Oder fügen Sie -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" hinzu zu VM-Optionen. Aber es ist besser, solche Optionen in der Konfigurationsdatei zu speichern.

Im Moment verwenden wir PostgreSQL 9.6 und Hibernate 5.2.12.Final. Aus irgendeinem Grund schlugen alle Validierungen von materialisierten Ansichten fehl, mit der folgenden Ausnahme:

Alle Entitäten, die die Validierung erfolgreich bestanden haben, waren entweder einfache Tabellen oder Ansichten.

Es scheint, als wäre dies ein Standardverhalten für generische Datenbanken. In Quellen hier in den Zeilen 79-81 sie fügen nur diese Typen hinzu:

final List<String> tableTypesList = new ArrayList<>();
tableTypesList.add( "TABLE" );
tableTypesList.add( "VIEW" );

Zeilen 85-87 teilen Sie uns mit, dass es eine Möglichkeit gibt, diese fest codierten Werte mit benutzerdefinierten zu erweitern:

if ( extraPhysicalTableTypes != null ) {
    Collections.addAll( tableTypesList, extraPhysicalTableTypes );
}

Auf Zeile 56 es wird als private String[] extraPhysicalTableTypes; deklariert , und auf den Zeilen 71-77 diesem Array wurden einige weitere Werte hinzugefügt:

if ( !"".equals( extraPhysycalTableTypesConfig.trim() ) ) {
    this.extraPhysicalTableTypes = StringHelper.splitTrimmingTokens(
        ",;",
        extraPhysycalTableTypesConfig,
        false
    );
}

Sie stammen aus den Zeilen 66-70 , codiert als String unter dem Schlüssel EXTRA_PHYSICAL_TABLE_TYPES mit leerem Standardwert:

final String extraPhysycalTableTypesConfig = configService.getSetting(
    AvailableSettings.EXTRA_PHYSICAL_TABLE_TYPES,
    StandardConverters.STRING,
    ""
);

Und hier auf Linie 1545 ist die Deklaration dieses Schlüssels:

/**
 * Identifies a comma-separate list of values to specify extra table types,
 * other than the default "TABLE" value, to recognize as defining a physical table
 * by schema update, creation and validation.
 *
 * @since 5.0
 */
String EXTRA_PHYSICAL_TABLE_TYPES = "hibernate.hbm2dll.extra_physical_table_types";

Wenn Sie also diese Eigenschaft hinzufügen, wird tableTypesList ein weiterer Eintrag hinzugefügt das zum Filtern vieler anderer Entitäten in der Datenbank verwendet wird, wie z. B. Sequenzen, Indizes, temporäre Tabellen und andere, die einen ähnlichen Namen wie Ihre materialisierte Ansicht haben können.

So sieht meine persistence.xml aus sieht so aus, falls es dich interessiert:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">
    <persistence-unit name="project-pu">
        <jta-data-source>java:jboss/datasources/project-pu</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisPG95Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="validate"/>
            <property name="hibernate.hbm2dll.extra_physical_table_types" value="MATERIALIZED VIEW"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.use_sql_comments" value="false"/>
            <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/mgt"/>
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

P.S. Ich weiß, es ist ein sehr alter Beitrag, aber ich habe ein paar Tage mit diesem Problem gekämpft. Ich fand keine Antwort, also beschloss ich, sie irgendwo ins Internet zu stellen. Und dieses Irgendwo wurde hier. :)