PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Brak tabeli w widoku zmaterializowanym

Od kilku dni mam ten sam błąd. Jako ta odpowiedź powiedział, że można wyłączyć hibernate.hbm2ddl.auto właściwość w Twoim persistence.xml , ale nie jest to dobry pomysł, jeśli Twój projekt szybko się rozwija.

TL;DR: ustaw właściwość hibernate.hbm2dll.extra_physical_table_types do MATERIALIZED VIEW .

Lub dodaj -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" do opcji maszyny wirtualnej. Ale lepiej takie opcje do pliku konfiguracyjnego.

Obecnie używamy PostgreSQL 9.6 i Hibernate 5.2.12.Final. W jakiś sposób wszystkie walidacje widoków zmaterializowanych kończyły się niepowodzeniem z następującym wyjątkiem:

Wszystkie jednostki, które pomyślnie przeszły weryfikację, były albo prostymi tabelami, albo widokami.

Wygląda na to, że jest to domyślne zachowanie dla ogólnych baz danych. W źródłach tutaj w liniach 79-81 dodają tylko te typy:

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

Linie 85-87 powiedz nam, że istnieje możliwość rozszerzenia tych zakodowanych na stałe wartości o niestandardowe:

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

Na linii 56 jest zadeklarowany private String[] extraPhysicalTableTypes; , a w liniach 71-77 do tej tablicy dodano jeszcze kilka wartości:

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

Pochodzą z wierszy 66-70 , zakodowany jako String pod kluczem EXTRA_PHYSICAL_TABLE_TYPES z pustą wartością domyślną:

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

I tu on-line 1545 jest deklaracja tego klucza:

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

Tak więc dodanie tej właściwości doda kolejny wpis do tableTypesList który jest używany do filtrowania wielu innych jednostek w bazie danych, takich jak sekwencje, indeksy, tabele tymczasowe i inne, które mogą mieć nazwę podobną do Twojego zmaterializowanego widoku.

W ten sposób mój persistence.xml wygląda tak, jeśli jesteś zainteresowany:

<?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 Wiem, że to bardzo stary post, ale walczyłem z tym problemem przez kilka dni. Nie udało mi się znaleźć odpowiedzi, więc postanowiłem umieścić ją gdzieś w Internecie. I to gdzieś stało się tutaj. :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak skopiować wolumin dockera z jednego komputera na drugi?

  2. Co oznacza epoch w txid_current() w postgresql?

  3. zaimportuj plik CSV do postgresa przez php na stronie internetowej

  4. Czy można wykonać rekurencyjne zapytanie SQL?

  5. Jak Atan2() działa w PostgreSQL