PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Tavolo mancante nella vista materializzata

Ho avuto lo stesso bug negli ultimi giorni. Come questa risposta detto, è possibile disabilitare hibernate.hbm2ddl.auto proprietà nel tuo persistence.xml , ma non è una buona idea se il tuo progetto si sta sviluppando rapidamente.

TL;DR: imposta la proprietà hibernate.hbm2dll.extra_physical_table_types a MATERIALIZED VIEW .

Oppure aggiungi -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" alle opzioni VM. Ma è meglio tali opzioni per il file di configurazione.

In questo momento, stiamo usando PostgreSQL 9.6 e Hibernate 5.2.12.Final. Per qualche motivo, tutte le convalide delle viste materializzate non hanno avuto successo con la seguente eccezione:

Tutte le entità che hanno superato con successo la convalida erano tabelle o viste semplici.

Sembra che sia un comportamento predefinito per i database generici. Nelle fonti qui sulle righe 79-81 aggiungono solo questi tipi:

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

Righe 85-87 dicci che esiste la possibilità di estendere questi valori hardcoded con valori personalizzati:

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

In linea 56 è dichiarato private String[] extraPhysicalTableTypes; ,e sulle righe 71-77 ci sono altri valori aggiunti a questo array:

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

Provengono dalle righe 66-70 , codificato come String nella chiave EXTRA_PHYSICAL_TABLE_TYPES con valore predefinito vuoto:

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

E qui sulla linea 1545 è la dichiarazione di quella chiave:

/**
 * 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";

Quindi, l'aggiunta di questa proprietà aggiungerà un'altra voce a tableTypesList che viene utilizzato per filtrare molte altre entità nel database, come sequenze, indici, tabelle temporanee e altri, che potrebbero avere un nome simile alla tua vista materializzata.

Ecco come il mio persistence.xml sembra, se sei interessato:

<?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>

PS So che è un post molto vecchio, ma ho combattuto con questo problema per alcuni giorni. Non sono riuscito a trovare una risposta, quindi ho deciso di metterla da qualche parte in Internet. E questo da qualche parte è diventato qui. :)