sql >> Database >  >> RDS >> PostgreSQL

Ontbrekende tabel op gematerialiseerde weergave

Ik heb de afgelopen dagen dezelfde bug gehad. Als dit antwoord gezegd, is het mogelijk om hibernate.hbm2ddl.auto uit te schakelen eigenschap in uw persistence.xml , maar het is geen goed idee als uw project zich snel ontwikkelt.

TL;DR: eigenschap instellen hibernate.hbm2dll.extra_physical_table_types naar MATERIALIZED VIEW .

Of voeg -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" toe naar VM-opties. Maar het is beter om dergelijke opties in het configuratiebestand te plaatsen.

Op dit moment gebruiken we PostgreSQL 9.6 en Hibernate 5.2.12.Final. Op de een of andere manier faalden alle validaties van gerealiseerde weergaven met de volgende uitzondering:

Alle entiteiten die de validatie met succes hebben doorstaan, waren ofwel eenvoudige tabellen of weergaven.

Het lijkt erop dat dit een standaardgedrag is voor generieke databases. In bronnen hier op regels 79-81 ze voegen alleen deze typen toe:

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

Regels 85-87 vertel ons dat er een mogelijkheid is om deze hardcoded waarden uit te breiden met aangepaste:

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

Online 56 het wordt verklaard private String[] extraPhysicalTableTypes; ,en op regels 71-77 er zijn wat meer waarden toegevoegd aan deze array:

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

Ze komen uit de regels 66-70 , gecodeerd als String onder sleutel EXTRA_PHYSICAL_TABLE_TYPES met lege standaardwaarde:

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

En hier online 1545 is de verklaring van die sleutel:

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

Dus, het toevoegen van deze eigenschap zal een nieuw item toevoegen aan tableTypesList die wordt gebruikt voor het filteren van vele andere entiteiten in de database, zoals reeksen, indices, tijdelijke tabellen en andere, die een naam kunnen hebben die lijkt op die van u.

Dit is hoe mijn persistence.xml ziet eruit als, als je geïnteresseerd bent:

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

PS Ik weet dat het een heel oud bericht is, maar ik heb een paar dagen met dit probleem geworsteld. Ik kon geen antwoord vinden, dus besloot ik het ergens op internet te zetten. En dit werd ergens hier. :)



  1. array in MySQL

  2. Meerdere afbeeldingen invoegen in de MySQL-databasetabel met een externe sleutel die verwijst naar een enkele primaire sleutel

  3. twee tabellen samenvoegen met meerdere voorwaarden in rails

  4. dayname(curdate()) werkt NIET in codeigniter php