Tôi đã có cùng một lỗi trong vài ngày qua. Như câu trả lời này
cho biết, có thể tắt hibernate.hbm2ddl.auto
thuộc tính trong persistence.xml
của bạn , nhưng không phải là ý kiến hay nếu dự án của bạn đang phát triển nhanh chóng.
TL; DR: đặt thuộc tính hibernate.hbm2dll.extra_physical_table_types
thành MATERIALIZED VIEW
.
Hoặc thêm -Dhibernate.hbm2dll.extra_physical_table_types="MATERIALIZED VIEW"
đến các tùy chọn VM. Nhưng tốt hơn là các tùy chọn như vậy đối với tệp cấu hình.
Hiện tại, chúng tôi đang sử dụng PostgreSQL 9.6 và Hibernate 5.2.12.Final. Tại sao, tất cả các lần xác thực chế độ xem cụ thể hóa đều không thành công với ngoại lệ sau:
Tất cả các thực thể đã vượt qua xác thực thành công đều là bảng hoặc dạng xem đơn giản.
Có vẻ như nó là một hành vi mặc định cho cơ sở dữ liệu chung. Trong các nguồn tại đây
trên các dòng 79-81
họ chỉ thêm các loại sau:
final List<String> tableTypesList = new ArrayList<>();
tableTypesList.add( "TABLE" );
tableTypesList.add( "VIEW" );
Các dòng 85-87
cho chúng tôi biết rằng có khả năng mở rộng các giá trị được mã hóa cứng này bằng các giá trị tùy chỉnh:
if ( extraPhysicalTableTypes != null ) {
Collections.addAll( tableTypesList, extraPhysicalTableTypes );
}
Trên dòng 56
nó được khai báo private String[] extraPhysicalTableTypes;
và trên các dòng 71-77
có một số giá trị khác được thêm vào mảng này:
if ( !"".equals( extraPhysycalTableTypesConfig.trim() ) ) {
this.extraPhysicalTableTypes = StringHelper.splitTrimmingTokens(
",;",
extraPhysycalTableTypesConfig,
false
);
}
Chúng đến từ các dòng 66-70
, được mã hóa dưới dạng Chuỗi trong khóa EXTRA_PHYSICAL_TABLE_TYPES
với giá trị mặc định trống:
final String extraPhysycalTableTypesConfig = configService.getSetting(
AvailableSettings.EXTRA_PHYSICAL_TABLE_TYPES,
StandardConverters.STRING,
""
);
Và tại đây
trên dòng 1545
là khai báo của khóa đó:
/**
* 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";
Vì vậy, việc thêm thuộc tính này sẽ thêm một mục nhập khác vào tableTypesList
được sử dụng để lọc nhiều thực thể khác trong cơ sở dữ liệu, chẳng hạn như chuỗi, chỉ số, bảng tạm thời và những thực thể khác, có thể có tên tương tự như chế độ xem cụ thể hóa của bạn.
Đây là cách persistence.xml
của tôi trông giống như, nếu bạn quan tâm:
<?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. Tôi biết đó là một bài viết rất cũ, nhưng tôi đã chiến đấu với vấn đề này trong vài ngày. Tôi không tìm được câu trả lời, vì vậy tôi quyết định đưa nó vào một nơi nào đó trên Internet. Và điều này ở đâu đó đã trở thành ở đây. :)