sql >> Databasteknik >  >> RDS >> PostgreSQL

Saknas tabell på materialiserad vy

Jag har haft samma bugg i flera senaste dagar. Som det här svaret sagt, det är möjligt att inaktivera hibernate.hbm2ddl.auto egenskap i din persistence.xml , men det är inte en bra idé om ditt projekt utvecklas snabbt.

TL;DR: set egenskapen hibernate.hbm2dll.extra_physical_table_types till MATERIALIZED VIEW .

Eller lägg till -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" till VM-alternativ. Men det är bättre att sådana alternativ till konfigurationsfil.

Just nu använder vi PostgreSQL 9.6 och Hibernate 5.2.12.Final. På något sätt misslyckades alla materialiserade vyer med följande undantag:

Alla enheter som klarade valideringen var antingen enkla tabeller eller vyer.

Det verkar som om det är ett standardbeteende för generiska databaser. I källor här på raderna 79-81 de lägger bara till dessa typer:

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

Rader 85-87 berätta för oss att det finns en möjlighet att utöka dessa hårdkodade värden med anpassade:

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

På rad 56 den deklareras private String[] extraPhysicalTableTypes; ,och på raderna 71-77 det finns några fler värden som lagts till i denna array:

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

De kommer från raderna 66-70 , kodad som sträng under nyckel EXTRA_PHYSICAL_TABLE_TYPES med tomt standardvärde:

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

Och här on line 1545 är deklarationen av den nyckeln:

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

Så om du lägger till den här egenskapen läggs ytterligare en post till tableTypesList som används för att filtrera många andra enheter i databasen, såsom sekvenser, index, temporära tabeller och andra, som kan ha namn som liknar din materialiserade vy.

Så här är min persistence.xml ser ut som om du är intresserad:

<?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. Jag vet att det är ett väldigt gammalt inlägg, men jag kämpade med det här problemet i några dagar. Jag kunde inte hitta ett svar, så jag bestämde mig för att lägga det någonstans på Internet. Och det här någonstans blev här. :)



  1. Generera tabell DDL via fråga på MySQL och SQL Server

  2. Installera WordPress med Nginx, MariaDB 10 och PHP 7 på Debian 9

  3. Oracle-databas 12c Fel vid försök att ansluta:Nätverksadaptern kunde inte upprätta anslutningen

  4. Hur kan jag infoga en lista som returneras från pyodbc mssql-frågan i mysql genom lagrad procedur med pymysql