簡體   English   中英

SchemaManagementException:模式驗證:即使數據庫中存在表,也缺少表 [chk_groups]

[英]SchemaManagementException: Schema-validation: missing table [chk_groups] even when table is present in DB

首先,我知道stackoverflow上有很多與此相關的問題,但沒有一個能解決我的問題。 這就是我發布這個的原因。

在嘗試連接到 SQL 服務器數據庫並嘗試使用hibernate.hbm2ddl.auto字段的“驗證”值驗證現有數據庫結構時,我遇到了一個非常奇怪的問題。 但我得到以下錯誤,

SchemaManagementException: Schema-validation: missing table [chk_groups]

以下是我的實體配置,

@Table(name="chk_groups")
public class GroupEntity {
}

@Entity
@Table(name="chk_members")
public class MemberEntity {
}

我在屬性文件中使用了正確的配置,如下所示,

spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://localhost\instanceName;databaseName=companyDB
spring.datasource.username=sa
spring.datasource.password=sa

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.SQLServer2012Dialect
spring.jpa.hibernate.ddl-auto = validate

現在在 MS sql 服務器中,默認模式名稱是“dbo”,理想情況下應該在驗證數據庫結構時選擇它。 但可以肯定的是,當我第一次出現丟失表錯誤時,我也嘗試像下面這樣手動配置它。 仍然沒有運氣。

@Entity
@Table(name="chk_groups", schema="dbo")
public class GroupEntity {

@Entity
@Table(name="chk_members", schema="dbo")
public class MemberEntity {

我也嘗試設置以下屬性,

spring.jpa.properties.hibernate.default_schema= dbo

我什至試過,

@Entity (name="chk_groups")
public class GroupEntity {
}

我 100% 確定數據庫表存在,因為我可以使用舊的 JDBC 模板方式訪問它,並且可以對其執行所有 CRUD 操作而不會出現任何錯誤。

當我嘗試使用 spring 引導和數據 JPA 方式通過 java 代碼創建的實體來驗證現有數據庫結構時,問題就出現了。 我不能使用更新或創建或其他任何東西,因為已經創建了數據庫結構。 我應該使用 java 實體對它進行 map 。

我無法弄清楚可能導致這種情況的問題是什么? 這是否與用戶需要簡單地驗證架構的任何特定權限相關? 有沒有辦法使用任何數據庫查詢權限來檢查它? 或者它可以是別的東西嗎?

我已經盡力了。 請幫幫我。

我通過在application.properties中添加以下屬性來解決它

spring.jpa.properties.hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=individually

進行了長時間的調試 session 直到我找到罪魁禍首:

Hibernate:模式驗證:缺少表

我不得不重新定義CamelCaseToUnderscoresNamingStrategy的某些部分:

public class CustomCamelCaseToUnderscoresNamingStrategy extends CamelCaseToUnderscoresNamingStrategy {

    private static final Pattern LOWER_RE = Pattern.compile("[a-z]");

    /**
     * Lowercase only if there is lowercase (like if entity name is "User" we want a table with name "user").
     * Do not change the name if it is all uppercase.
     */
    @Override
    protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) {
        if (LOWER_RE.matcher(name).find()) {
            name = name.toLowerCase(Locale.ROOT);
        }
        return new Identifier( name, quoted );
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM