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オプションへ。ただし、構成ファイルにはこのようなオプションを使用することをお勧めします。

    現在、PostgreSQL9.6とHibernate5.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>
    

    追伸非常に古い投稿であることは知っていますが、この問題と数日間戦いました。答えが見つからなかったので、インターネットのどこかに置くことにしました。そして、これはどこかでここになりました。 :)



    1. なぜオラクルは単一のクエリで複数のテーブルを更新することをサポートしないのですか?

    2. SQL ServerのCHARINDEX()とPATINDEX()–違いは何ですか?

    3. bind_paramを使用してMySQLiにMySQLNOW()関数を使用してレコードを挿入するにはどうすればよいですか?

    4. MySQLデータベースがクラッシュしたのはなぜですか?新しいMySQLフリーズフレームで洞察を得る