PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Tabela ausente na visualização materializada


Eu tive o mesmo bug por vários dias passados. Como esta resposta dito, é possível desabilitar hibernate.hbm2ddl.auto propriedade em seu persistence.xml , mas não é uma boa ideia se o seu projeto estiver se desenvolvendo rapidamente.

TL;DR: definir propriedade hibernate.hbm2dll.extra_physical_table_types para MATERIALIZED VIEW .

Ou adicione -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" para opções de VM. Mas é melhor essas opções para arquivo de configuração.

No momento, estamos usando o PostgreSQL 9.6 e o ​​Hibernate 5.2.12.Final. Por alguma razão, todas as validações de visualizações materializadas estavam falhando com a seguinte exceção:

Todas as entidades que passaram na validação com sucesso eram tabelas ou visualizações simples.

Parece que é um comportamento padrão para bancos de dados genéricos. Nas fontes aqui nas linhas 79-81 eles adicionam apenas estes tipos:
final List<String> tableTypesList = new ArrayList<>();
tableTypesList.add( "TABLE" );
tableTypesList.add( "VIEW" );

Linhas 85-87 diga-nos que existe a possibilidade de estender esses valores codificados com valores personalizados:
if ( extraPhysicalTableTypes != null ) {
    Collections.addAll( tableTypesList, extraPhysicalTableTypes );
}

Na linha 56 é declarado private String[] extraPhysicalTableTypes; , e nas linhas 71-77 há mais alguns valores adicionados a esta matriz:
if ( !"".equals( extraPhysycalTableTypesConfig.trim() ) ) {
    this.extraPhysicalTableTypes = StringHelper.splitTrimmingTokens(
        ",;",
        extraPhysycalTableTypesConfig,
        false
    );
}

Eles vêm das linhas 66-70 , codificado como String na chave EXTRA_PHYSICAL_TABLE_TYPES com valor padrão vazio:
final String extraPhysycalTableTypesConfig = configService.getSetting(
    AvailableSettings.EXTRA_PHYSICAL_TABLE_TYPES,
    StandardConverters.STRING,
    ""
);

E aqui na linha 1545 é a declaração dessa chave:
/**
 * 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";

Portanto, adicionar esta propriedade adicionará outra entrada a tableTypesList que é usado para filtragem de muitas outras entidades no banco de dados, como sequências, índices, tabelas temporárias e outras, que podem ter nome semelhante à sua visualização materializada.

É assim que meu persistence.xml parece, se você estiver interessado:
<?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. Eu sei que é um post muito antigo, mas lutei com esse problema por alguns dias. Não consegui encontrar uma resposta, então decidi colocá-la em algum lugar na Internet. E isso em algum lugar se tornou aqui. :)