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

Manglende tabel over materialiseret udsigt

Jeg har haft den samme fejl i flere sidste dage. Som dette svar sagt, er det muligt at deaktivere hibernate.hbm2ddl.auto egenskab i din persistence.xml , men det er ikke en god idé, hvis dit projekt udvikler sig hurtigt.

TL;DR: sæt egenskaben hibernate.hbm2dll.extra_physical_table_types til MATERIALIZED VIEW .

Eller tilføj -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" til VM-muligheder. Men det er bedre at sådanne muligheder til konfigurationsfil.

Lige nu bruger vi PostgreSQL 9.6 og Hibernate 5.2.12.Final. På en eller anden måde mislykkedes alle materialiserede visningsvalideringer med følgende undtagelse:

Alle enheder, der bestod valideringen, var enten simple tabeller eller visninger.

Det ser ud til, at det er en standardadfærd for generiske databaser. I kilder her på linjer 79-81 de tilføjer kun disse typer:

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

Linjer 85-87 fortæl os, at der er mulighed for at udvide disse hårdkodede værdier med brugerdefinerede værdier:

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

Online 56 det er erklæret private String[] extraPhysicalTableTypes; ,og på linjerne 71-77 der er tilføjet nogle flere værdier i dette array:

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

De kommer fra linjerne 66-70 , kodet som streng under nøglen EXTRA_PHYSICAL_TABLE_TYPES med tom standardværdi:

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

Og her online 1545 er erklæringen om denne nøgle:

/**
 * 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å tilføjelse af denne egenskab vil tilføje endnu en post til tableTypesList der bruges til filtrering af mange andre entiteter i databasen, såsom sekvenser, indekser, midlertidige tabeller og andre, der kan have navn, der ligner din materialiserede visning.

Sådan er min persistence.xml ser ud, hvis du er interesseret:

<?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. Jeg ved, at det er et meget gammelt indlæg, men jeg kæmpede med dette problem i et par dage. Det lykkedes mig ikke at finde et svar, så jeg besluttede at lægge det et sted på internettet. Og dette et eller andet sted blev her. :)



  1. Lukning af en MySQL-forbindelse i PHP

  2. mysql - er i dag mellem to kolonneværdier

  3. MySQL:Få n. højeste værdi for hver gruppe i en tabel

  4. Hvordan ændres database_url på heroku?