sql >> Databáze >  >> RDS >> PostgreSQL

Chybějící tabulka na materializovaném pohledu

Několik posledních dní jsem měl stejnou chybu. Jako tato odpověď řekl, že je možné zakázat hibernate.hbm2ddl.auto vlastnost ve vašem persistence.xml , ale není to dobrý nápad, pokud se váš projekt rychle rozvíjí.

TL;DR: nastavit vlastnost hibernate.hbm2dll.extra_physical_table_types na MATERIALIZED VIEW .

Nebo přidejte -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" na možnosti VM. Ale je lepší tyto volby do konfiguračního souboru.

Právě teď používáme PostgreSQL 9.6 a Hibernate 5.2.12.Final. Nějakým způsobem selhávaly všechny validace materializovaných pohledů s následující výjimkou:

Všechny entity, které úspěšně prošly validací, byly buď jednoduché tabulky, nebo pohledy.

Zdá se, že je to výchozí chování pro obecné databáze. Ve zdrojích zde na řádcích 79-81 přidávají pouze tyto typy:

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

Řádky 85-87 řekněte nám, že existuje možnost rozšířit tyto pevně zakódované hodnoty o vlastní:

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

Na řádku 56 je deklarován jako private String[] extraPhysicalTableTypes; a na řádcích 71-77 do tohoto pole jsou přidány další hodnoty:

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

Pocházejí z řádků 66-70 , zakódovaný jako řetězec pod klíčem EXTRA_PHYSICAL_TABLE_TYPES s prázdnou výchozí hodnotou:

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

A zde na řádku 1545 je deklarace tohoto klíče:

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

Přidání této vlastnosti tedy přidá další položku do tableTypesList který se používá pro filtrování mnoha dalších entit v databázi, jako jsou sekvence, indexy, dočasné tabulky a další, které mohou mít podobný název jako váš materializovaný pohled.

Takto vypadá můj persistence.xml vypadá to, pokud máte zájem:

<?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. Vím, že je to velmi starý příspěvek, ale pár dní jsem s tímto problémem bojoval. Nepodařilo se mi najít odpověď, tak jsem se rozhodl ji dát někam na internet. A tady se to někde stalo. :)



  1. Opravte poškozenou databázi SQL během problému s upgradem

  2. Správa transakcí s DAO

  3. odkazuje cizí klíč vždy na jedinečný klíč v jiné tabulce?

  4. Získejte Prevision Next záznam v JEDNOM ŘÁDKU