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