为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: 8
【操作系统】:win10
【CPU】: i5
【问题描述】*:整合springboot,ddl_auto=update,重启项目报错表xx已存在,索引xxx已存在
这是因为达梦查询出来的是小写表名,匹配又转换成大写了,导致无法匹配。继承DmDialect自定义个Dialect,重写buildIdentifierHelper即可
/**
* @param builder
* @param dbMetaData
* @return {@link IdentifierHelper}
* @author 杨xx
* @date 2024-08-13 16:46
* @des 无此定义 hibernate ddl-auto=auto将会导致无法匹配从而重复创建表
* 查询时表名称为小写, 匹配时 默认转换成大写 导致无法匹配;MIXED表示不处理 原样返回
*/
@Override
public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, DatabaseMetaData dbMetaData) throws SQLException {
builder.applyIdentifierCasing(dbMetaData);
builder.applyReservedWords(dbMetaData);
builder.applyReservedWords(AnsiSqlKeywords.INSTANCE.sql2003());
builder.applyReservedWords(super.getKeywords());
builder.setNameQualifierSupport(getNameQualifierSupport());
builder.setUnquotedCaseStrategy(IdentifierCaseStrategy.MIXED);
return builder.build();
}
以上,方便后来人找到答案,解决问题。
需要注意,以上在开启忽略大小写有效,其它设置未知。
跟了下源码调试,整合springboot时,达梦数据库SYS.DBA_TABLES表保存的是小写的表名,hibernate在判断时候获取到的时大写的表名,所以判断不存在表,重新创建~