sql >> Base de Datos >  >> RDS >> PostgreSQL

Falta la tabla en la vista materializada

He tenido el mismo error durante varios días. Como esta respuesta dicho, es posible deshabilitar hibernate.hbm2ddl.auto propiedad en su persistence.xml , pero no es una buena idea si su proyecto se está desarrollando rápidamente.

TL;RD: establecer la propiedad hibernate.hbm2dll.extra_physical_table_types a MATERIALIZED VIEW .

O agregue -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" a las opciones de VM. Pero es mejor esas opciones que el archivo de configuración.

En este momento, estamos usando PostgreSQL 9.6 e Hibernate 5.2.12.Final. Por alguna razón, todas las validaciones de vistas materializadas estaban fallando con la siguiente excepción:

Todas las entidades que pasaron con éxito la validación fueron tablas simples o vistas.

Parece que es un comportamiento predeterminado para bases de datos genéricas. En fuentes aquí en las líneas 79-81 agregan solo estos tipos:

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

Líneas 85-87 díganos que existe la posibilidad de ampliar estos valores codificados con valores personalizados:

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

En línea 56 se declara private String[] extraPhysicalTableTypes; y en las líneas 71-77 hay algunos valores más agregados a esta matriz:

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

Vienen de las líneas 66-70 , codificado como Cadena bajo la clave EXTRA_PHYSICAL_TABLE_TYPES con valor predeterminado vacío:

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

Y aquí en línea 1545 es la declaración de esa clave:

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

Entonces, agregar esta propiedad agregará otra entrada a tableTypesList que se utiliza para filtrar muchas otras entidades en la base de datos, como secuencias, índices, tablas temporales y otras, que pueden tener un nombre similar al de su vista materializada.

Así funciona mi persistence.xml parece, si está interesado:

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

PD Sé que es una publicación muy antigua, pero luché con este problema durante unos días. No pude encontrar una respuesta, así que decidí ponerla en algún lugar de Internet. Y este lugar se convirtió aquí. :)