JPA连接达梦数据库导致auto-ddl失效问题解决

这篇具有很好参考价值的文章主要介绍了JPA连接达梦数据库导致auto-ddl失效问题解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  现象:
        项目使用了JPA,并且auto-ddl设置的为update,在连接达梦数据库的时候,第一次启动没有问题,但是后面重启就会报错,发现错误为重复建表,也就是说已经建好的表没有检测到,又重新走的建表流程。经过一天的排查,总结了2个解决方案。

 问题的根源:

        问题产生的原因是因为数据库实例设置了不区分大小写,并且在JPA的注解上的表名及字段名将表名都为小写时,在数据库创建的表名和字段名都为小写。在数据库连接后,会获取所有的表,和模型做匹配映射,没有映射的到的表会走创建表的流程,映射到的会走更新流程。但是在映射的过程中,达梦将映射部分强制设置为大写映射,并且这部分代码被写到了达梦的连接驱动内,很难进行扩展。这个映射部分源码要跟的很深,总的来说就是从数据库拿到的表名都是小写的,但是匹配的时候是将实体类上@Table的name值转为大写后再进行映射,而且这个是在达梦数据库的驱动里面设置的,重写方言的buildIdentifierHelper方法也没用。JPA连接达梦数据库导致auto-ddl失效问题解决,JAVA,数据库,Spring,数据库,java

 而且这个方法的builder是在父类中直接build()的,又没法在父类执行完后扩展,只能在执行前扩展,所以设置的值没用。

解决办法:

        1、达梦数据库创建数据库实例的时候使用默认的规则,区分大小写。不要创建不区分大小写的数据库实例,就不会有这个问题。并且记得在数据库连接里要设置参&ignoreCase=false&columnNameUpperCase=false

        示例:jdbc:dm://{ip}:{port}/{数据库}?schema={schema}&useUnicode=true&serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=UTF-8&ignoreCase=false&columnNameUpperCase=false

        2、匹配阶段不好解决,就在别的地方想想办法。问题的根源是因为实体类定义的大写表名和数据库中的小写表名匹配不上导致的,那就在建表阶段将表设置为大写就行了。而建表阶段的代码重新方言是可以做到的。

        创建自定义的StandardTableExporter

import org.hibernate.boot.Metadata;
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
import org.hibernate.dialect.Dialect;
import org.hibernate.mapping.Table;
import org.hibernate.tool.schema.internal.StandardTableExporter;


public class DmStandardTableExporter extends StandardTableExporter {

    public DmStandardTableExporter(Dialect dialect) {
        super(dialect);
    }

    @Override
    public String[] getSqlCreateStrings(Table table, Metadata metadata, SqlStringGenerationContext context) {
        table.setName(table.getName().toUpperCase());
        return super.getSqlCreateStrings(table, metadata, context);
    }
}

        重写达梦方言的getTableExporter方法

import org.hibernate.dialect.DmDialect;


public class ZeusDmDialect extends DmDialect {
    
    //这里是你自定义的StandardTableExporter
    private DmStandardTableExporter tableExporter = new DmStandardTableExporter( this );

    @Override
    public DmStandardTableExporter getTableExporter() {
        return tableExporter;
    }
}

        配置使用自己写的写的方言:

spring:
  jpa:
    properties:
      hibernate:
        dialect: a.b.c.d.e.ZeusDmDialect #这里配置自己写的类的全路径名称,别照抄!!!

把数据库的之前创建的小写的表名的表全删了,多重启几次试试看,应该就解决问题了。文章来源地址https://www.toymoban.com/news/detail-608886.html

到了这里,关于JPA连接达梦数据库导致auto-ddl失效问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mac使用DBeaver连接达梦数据库

    下载达梦驱动包 达梦数据库 在下载页面随便选择一个系统并下载下来。 下载下来的是zip的压缩包解压出来就是一个ISO文件,然后我们打开ISO文件进入目录: /dameng/source/drivers/jdbc 进入目录后找到这几个驱动包,随便选一个都能使用,当然我选的肯定是最新版的。 进入DBeave

    2024年02月08日
    浏览(77)
  • docker安装达梦8,并且远程连接数据库

    官方技术文档地址:https://eco.dameng.com/document/dm/zh-cn/start/index.html 不能直接拉取达梦数据库的镜像,需要去官方提供的下载地址下载镜像,上传到服务器 下载地址:https://eco.dameng.com/download/ 下载完成之后确认下载文件大小无误,我下载的是dm8_20220822_rev166351_x86_rh6_64_ctm.tar 大小

    2024年02月17日
    浏览(54)
  • IDEA自带的Database连接达梦数据库

    达梦数据库无法使用Navicat,只能使用自带的数据库管理工具,但是非常难用,所以想使用IDEA自带的Database连接达梦数据库。 首先下载达梦jdbc驱动包 选择Driver 确定达梦驱动 从datasource选择达梦数据库 填写数据源信息 上面的URL就是jdbc连接的url。 点击测试连接 成功,即可连接

    2024年02月13日
    浏览(50)
  • 开发 | JAVA连接达梦数据库(DM8)

    本文参考文献 https://eco.dameng.com/docs/zh-cn/start/java-development.html https://eco.dameng.com/docs/zh-cn/app-dev/index.html 本文通过以下方式实现Java程序与DM8数据库的交互 使用JDBC接口(不用框架,最简单) 使用MyBatis框架 使用Spring框架 使用SpringBoot Jdbc 框架 Java的软件开发工具包(SDK) JDK(Ja

    2024年02月07日
    浏览(72)
  • 往docker中cloudbeaver的容器添加达梦数据库、impala数据库连接支持(cloudbeaver添加自定义数据连接)

    cloudbeaver默认没有开放impala连接,更不会支持国产数据库了 docker安装运行cloudbeaver可以参考文章:docker安装运行CloudBeaver并设置默认语言为中文 本文跳过cloudbeaver镜像拉取,直接就开始实现自定义数据库连接功能 1.1、新建挂载的宿主机根目录 挂载的文件都放置该目录下 1.2、运

    2024年01月19日
    浏览(84)
  • windows 达梦数据库服务连接时提示:登录服务器失败,错误号6001,错误消息:网络通信异常 之数据库服务不存在的处理方式

    在windows客户端上连接部署在windows操作系统上的达梦数据库, 使用DM管理工具连接数据库    正确输入用户名与密码之后点击确定按钮之后出现: 登录服务器失败,错误号6001,错误消息:网络通信异常  现象 如下图所示:   在之前也发布了一篇关于此错误的博文: 达梦管

    2024年02月11日
    浏览(57)
  • PostgreSQL数据库——Docker版本的postgres安装 & Navicat连接方式+导入向导使用 & SpringBoot结合Jpa使用PostgreSQL初步

    1.PostgreSQL数据库初始,开源; 2.Docker版本的postgres安装,以及挂载启动; 3.Navicat连接方式+导入向导使用,导入csv文件; 4.SpringBoot结合Jpa使用PostgreSQL初步; PostgreSQL是一种开源的关系型数据库管理系统(RDBMS),它是一种高度可扩展的、可靠的、功能丰富的数据库系统。以下是

    2024年02月04日
    浏览(78)
  • 按键精灵、auto.js等一些移动端脚本 如何连接云服务器的数据库, 进行读写操作

    一、技术背景         按键手机版和auto.js,只支持连接本地数据库sqllite,该数据库只存在本地 其他设备无法读写,就像本地的txt一样。         而很多脚本作者的需求是:多个脚本,甚至在全国不同城市的脚本也能读取和写入同一批数据,比如云端统一配置、集中上传

    2024年02月16日
    浏览(52)
  • <达梦>《达梦数据库备份归档》

    方式 备份 DIsql 工具 用于执行联机的数据备份与数据还原,包括数据库备份、归档备份、表空间备份与还原、表备份与还原; DMRMAN 工具 用于执行脱机的数据备份、还原与恢复,包括脱机的数据库备份、还原与恢复,脱机还原表空间,归档的备份、还原与修复; 客户端工具

    2024年02月05日
    浏览(73)
  • 达梦数据库创建及数据库实例管理

    数据库配置助手创建数据库调用 dbca.sh 图形化界面创建数据库: [dmdba@DCA02 tool]$ ./dbca.sh 2021-01-11 11:43:45 [com.dameng.dbca.Startup] [INFO] 启动 DBCA 指定数据库名称、实例名称(单机情况下数据库和实例名称可以相同),指定端口号: 簇大小、页大小、字符集、 字符串 大小写敏感、

    2023年04月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包