![](/img/trans.png)
[英]SqlServer2016, Hibernate schema-validation: Missing table, but table exists in db
[英]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 直到我找到罪魁禍首:
我不得不重新定義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.