PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Липсваща таблица при материализиран изглед

Имам същата грешка от няколко дни. Като този отговор каза, че е възможно да деактивирате hibernate.hbm2ddl.auto свойство във вашия persistence.xml , но не е добра идея, ако вашият проект се развива бързо.

TL;DR: задаване на свойство hibernate.hbm2dll.extra_physical_table_types към MATERIALIZED VIEW .

Или добавете -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW" към VM опции. Но е по-добре да използвате тези опции в конфигурационния файл.

В момента използваме PostgreSQL 9.6 и Hibernate 5.2.12.Final. Донякъде всички проверки на материализирани изгледи бяха неуспешни със следното изключение:

Всички обекти, преминали успешно валидиране, са били или прости таблици, или изгледи.

Изглежда, че това е поведение по подразбиране за общи бази данни. В източници тук на редове 79-81 те добавят само тези типове:

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

Редове 85-87 кажете ни, че има възможност за разширяване на тези твърдо кодирани стойности с персонализирани:

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

На ред 56 той се декларира като private String[] extraPhysicalTableTypes; , и на редове 71-77 има още няколко стойности, добавени в този масив:

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

Те идват от редове 66-70 , кодиран като низ под ключ EXTRA_PHYSICAL_TABLE_TYPES с празна стойност по подразбиране:

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

И тук на ред 1545 е декларацията на този ключ:

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

И така, добавянето на това свойство ще добави друг запис към tableTypesList който се използва за филтриране на много други обекти в базата данни, като последователности, индекси, временни таблици и други, които може да имат име, подобно на вашия материализиран изглед.

Ето как моят persistence.xml изглежда така, ако се интересувате:

<?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. Знам, че това е много стара публикация, но се борих с този проблем няколко дни. Не успях да намеря отговор, затова реших да го пусна някъде в Интернет. И това някъде стана тук. :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете серийна стойност по подразбиране след INSERT в PL/pgSQL

  2. Добавете индекси, за да ускорите търсенето в близост до Geocoder

  3. как да накарам array_agg() да работи като group_concat() от mySQL

  4. ГРЕШКА:функцията dblink(unknown, unknown) не съществува

  5. Кавичките са неправилни при използване на crosstab() в PostgreSQL