He tenido el mismo error durante varios días. Como esta respuesta
dicho, es posible deshabilitar hibernate.hbm2ddl.auto
propiedad en su persistence.xml
, pero no es una buena idea si su proyecto se está desarrollando rápidamente.
TL;RD: establecer la propiedad hibernate.hbm2dll.extra_physical_table_types
a MATERIALIZED VIEW
.
O agregue -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW"
a las opciones de VM. Pero es mejor esas opciones que el archivo de configuración.
En este momento, estamos usando PostgreSQL 9.6 e Hibernate 5.2.12.Final. Por alguna razón, todas las validaciones de vistas materializadas estaban fallando con la siguiente excepción:
Todas las entidades que pasaron con éxito la validación fueron tablas simples o vistas.
Parece que es un comportamiento predeterminado para bases de datos genéricas. En fuentes aquí
en las líneas 79-81
agregan solo estos tipos:
final List<String> tableTypesList = new ArrayList<>();
tableTypesList.add( "TABLE" );
tableTypesList.add( "VIEW" );
Líneas 85-87
díganos que existe la posibilidad de ampliar estos valores codificados con valores personalizados:
if ( extraPhysicalTableTypes != null ) {
Collections.addAll( tableTypesList, extraPhysicalTableTypes );
}
En línea 56
se declara private String[] extraPhysicalTableTypes;
y en las líneas 71-77
hay algunos valores más agregados a esta matriz:
if ( !"".equals( extraPhysycalTableTypesConfig.trim() ) ) {
this.extraPhysicalTableTypes = StringHelper.splitTrimmingTokens(
",;",
extraPhysycalTableTypesConfig,
false
);
}
Vienen de las líneas 66-70
, codificado como Cadena bajo la clave EXTRA_PHYSICAL_TABLE_TYPES
con valor predeterminado vacío:
final String extraPhysycalTableTypesConfig = configService.getSetting(
AvailableSettings.EXTRA_PHYSICAL_TABLE_TYPES,
StandardConverters.STRING,
""
);
Y aquí
en línea 1545
es la declaración de esa clave:
/**
* 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";
Entonces, agregar esta propiedad agregará otra entrada a tableTypesList
que se utiliza para filtrar muchas otras entidades en la base de datos, como secuencias, índices, tablas temporales y otras, que pueden tener un nombre similar al de su vista materializada.
Así funciona mi persistence.xml
parece, si está interesado:
<?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>
PD Sé que es una publicación muy antigua, pero luché con este problema durante unos días. No pude encontrar una respuesta, así que decidí ponerla en algún lugar de Internet. Y este lugar se convirtió aquí. :)