SchemaManagementException:模式验证:即使数据库中存在表,也缺少表 [chk_groups]

Posted

技术标签:

【中文标题】SchemaManagementException:模式验证:即使数据库中存在表,也缺少表 [chk_groups]【英文标题】:SchemaManagementException: Schema-validation: missing table [chk_groups] even when table is present in DB 【发布时间】:2020-03-10 13:05:32 【问题描述】:

首先,我知道 *** 上有很多与此相关的问题,但没有一个能解决我的问题。这就是我发布此内容的原因。

在尝试连接到 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 Boot 和数据 JPA 方式通过 java 代码创建的实体验证现有数据库结构时,问题就出现了。我不能使用更新或创建或其他任何东西,因为已经创建了数据库结构。我应该使用 java 实体映射到它。

我无法弄清楚可能导致此问题的问题是什么?这是否与用户需要简单地验证架构的任何特定权限相关?有没有办法使用任何数据库查询权限来检查它?或者它可以是其他东西吗?

我已经尽力了。请帮帮我。

【问题讨论】:

【参考方案1】:

在我找到罪魁祸首之前进行了长时间的调试:

Hibernate: Schema-validation: missing table

我不得不重新定义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 );
    

【讨论】:

【参考方案2】:

我通过在application.properties 中添加以下属性解决了这个问题

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

【讨论】:

以上是关于SchemaManagementException:模式验证:即使数据库中存在表,也缺少表 [chk_groups]的主要内容,如果未能解决你的问题,请参考以下文章

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column

Spring Boot gradle flyway - 验证错误 - 模式验证:缺少表

使用Hibernate在Java实体类上映射MySql无符号BigInt的正确数据类型是什么?