解决达梦集成 JPA 时表和字段注释注解不生效的问题

news2024/10/6 6:52:05

前言

最近在做达梦数据库集成 JPA 时,发现使用的表注解和字段注解均未生效(MySQL、Oracle、PostgreSQL中均可以在建表时正常生成相应的注释),经过调试发现解决办法也很简单:

  1. 自定义方言类继承自org.hibernate.dialect.DmDialect,重写supportsCommentOn方法返回 true:

    /**
     * 自定义 dm 方言类
     *
     * @author butterfly
     * @date 2024-03-11
     */
    public class MyDmDialect extends DmDialect {
        
        @Override
        public boolean supportsCommentOn() {
            return true;
        }
    
    }
    
  2. yaml 配置中使用自定义的方言类:

    spring:
      jpa:
        # 根据自己的类路径进行修改
        database-platform: cn.butterfly.config.MyDmDialect
    

如果大家也在使用达梦集成 JPA 时遇到了以上问题,按照上述说明配置即可。下面再说明一下我的解决思路以及后续如果集成其它数据库出现类似问题改如何解决。

产生背景

首先我们要知道的是 JPA 之所以能够帮助我们屏蔽不同 SQL 语言的差异,帮助我们自动建表,生成增删改查语句等等,其实都是内部帮助我们做了数据库类型的判断,然后生成或拼接相应的 SQL 语句。所以对于已经广泛使用的数据库,例如 MySQL、Oracle、PostgreSQL 等均能比较好地适配 JPA 的语法和提供的注解功能,而像达梦是近几年由于信创才开始在国内兴起,因此难免会有一些不兼容的情况,这也是本文出现的根本原因。

解决思路

正如标题所说,达梦是在自动建表时不支持 JPA 的表和字段注释注解,因此我们就需要找到负责拼接建表语句的org.hibernate.tool.schema.internal.StandardTableExporter类(类似地,如果建索引有问题就可以看org.hibernate.tool.schema.internal.StandardIndexExporter类),然后经过查找就可以发现如下负责拼接注释的代码:

image-20240311160054824

image-20240311155900650

这里可以看到第一张图是用于拼接列注释,第二张图的第一处红框用于拼接表注释,而第二张图的第二处调用的方法又进行了一次表和字段注释的拼接,这是什么原因呢?其实就是不同数据库的注释拼接方式不同而已,像 Mysql 的列注释直接拼接在字段说明后即可,表注释也是跟随建表语句一起,类似下图:

image-20240311160520593

而像 Oracle、达梦之类的数据库则是使用了comment on的语法形式,如下图所示:

image-20240311164106789

因此上述代码中有两种处理注释拼接的方式,同时也可以发现第一种拼接方式获取列注释和表注释时分别调用了dialect.getColumnComment( columnComment ) dialect.getTableComment( table.getComment() ) 方法,而第二种拼接方式则是调用了dialect.supportsCommentOn() 先进行判断,然后再处理注释的拼接。

这里的dialect即是方言对象:

image-20240311161141858

该类中包含以上三个方法,返回值不是 false 就是空字符串也就是不添加注释:

image-20240311162320023

不过在运行时会 JPA 会自动注入我们在 yaml 文件中的配置:

image-20240311161242178

但是到这里我们只是知道了注释的拼接方式,还不清楚为什么达梦数据库会出现失效的情况,那我们就先看一下 MySQL 和 Oracle 等数据库为什么能生效,首先是 MySQL(org.hibernate.dialect.MySQLDialect):

image-20240311161736307

可以发现 MySQL 内部重写了获取表和字段注释的方法,没有重写supportsCommentOn方法,而该方法默认返回 false,因此 MySQL 会使用第一种创建注释的方式,下面再看看 Oracle 的处理:

image-20240311162531332

可以看到 Oracle 只重写了supportsCommentOn方法并返回 true,也就是上面讲到的第二种拼接方式,而我们知道达梦和 Oracle 一样使用这种创建注释的方法,到这里相信大家也可以知道达梦无法创建表和字段注释的原因了,不过我们还是先看一下达梦的源码:

image-20240311162856009

可以发现达梦比较直接,直接把Dialect类中的代码原样不动搬过来了,还没有重载注解(懂得都懂,CV 大法🙂),因此我们只需要重写一个方言类继承自该类,然后使用即可,前言中已经说明,不再重述。

运行测试

在改完后,我们先再运行测试一下再结束本篇文章。首先我们创建一个实体类(这里的 IdEntity 就是包含 id 字段的类):

/**
 * Demo
 *
 * @author butterfly
 * @date 2024-03-11
 */
@Data
@Entity
@Table(name = "demo")
@EqualsAndHashCode(callSuper = true)
@org.hibernate.annotations.Table(appliesTo = "demo", comment = "演示表")
public class Demo extends IdEntity {
    
    /**
     * 字段
     */
    @Column(length = 50, nullable = false)
	@Comment("字段")
    private String field;
    
}

然后运行项目,Pass!

image-20240311163730319

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1509798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu 14.04:安装PaddlePaddle(Conda安装)

目录 一、PaddlePaddle 概要 二、PaddlePaddle安装要求 三、PaddlePaddle安装 3.1 安装 Anaconda3 3.2 创建Anaconda虚拟环境(python 3.8) 3.3 进入Anaconda虚拟环境 3.4 检测 Anaconda 虚拟环境配置是否符合PaddlePaddle安装要求 3.4.1 确认 py…

用链表实现顺序表的插入和删除操作(操作封装在函数中)

#include <iostream> using namespace std; struct node{int val;node * next; }; void print(node * head){if(headNULL ||head->nextNULL){cout<<"链表中已经无元素";return;}cout<<"打印列表:";node * phead->next;while(p){co…

开源好用的所见即所得(WYSIWYG)编辑器:Editor.js

文章目录 特点基于区块干净的数据 界面与交互插件标题和文本图片列表Todo表格 使用安装创建编辑器实例配置工具本地化自定义样式 今天介绍一个开源好用的Web所见即所得(WYSIWYG)编辑器&#xff1a; Editor.js Editor.js 是一个基于 Web 的所见即所得富文本编辑器&#xff0c;它…

FTP,SFTP,FTPS,SSL,TSL简介,区别,联系,使用场景说明

文章目录 简介FTPFTPSSFTP加密场景选择FTPS还是SFTPFTP、SFTP、FTPS区别、联系和具体使用场景如何使用FTP、SFTP和FTPSSSLTLSSSL和TLS区别和联系&#xff0c;以及使用场景SSL和TLS技术上的区别一些问题隐式的TLS&#xff08;FTPS/SSL&#xff09;或者显式的TLS&#xff08;FTPS…

【Datawhale学习笔记】从大模型到AgentScope

从大模型到AgentScope AgentScope是一款全新的Multi-Agent框架&#xff0c;专为应用开发者打造&#xff0c;旨在提供高易用、高可靠的编程体验&#xff01; 高易用&#xff1a;AgentScope支持纯Python编程&#xff0c;提供多种语法工具实现灵活的应用流程编排&#xff0c;内置…

蓝桥·算法双周赛|第七场分级赛——小白入门赛

&#x1f525;博客介绍&#xff1a; 27dCnc &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: << 算法入门>> 专题 : 数据结构帮助小白快速入门算法 &#x1f4…

【全志H616】1 --用orangepi控制硬件

【全志H616】1 --用orangepi控制硬件 本文介绍了如歌用orangepi 控制蜂鸣器&超声波模块&#xff0c;通过键盘输入1、2、3、4来控制转动角度舵机模块&#xff1b;同时还介绍了利用全志如何配置定时器&#xff1b;以及查看H616引脚状态的命令等… 超声波模块和舵机模块的讲解…

Python递归函数你用对了吗?

1.递归函数 递归函数&#xff1a;函数自己调用自己 2.需求 使用函数的方式&#xff0c;计算数字n的阶乘 # 5&#xff01; """ 5! 1 * 2 * 3 * 4 * 5 4! 1 * 2 * 3 * 4 3! 1 * 2 * 3 2! 1 * 2 1! 1综上可以总结出&#xff1a;n! n * (n - 1) "&qu…

案例分析篇02:软件架构设计考点之特定领域软件架构、架构评估、架构视图(2024年软考高级系统架构设计师冲刺知识点总结)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

鼠标在QTreeView、QTableView、QTableWidget项上移动,背景色改变

目录 1. 前言 2. 需求 3. 功能实现 3.1. 代码实现 3.2. 功能讲解 4. 附录 1. 前言 本博文用到了Qt的model/view framework框架,如果对Qt的“模型/视图/委托”框架不懂&#xff0c;本博文很难读懂。如果不懂这方面的知识&#xff0c;请在Qt Assistant 中输入Model/View…

[iOS]高版本MacOS运行低版本Xcode

Xcode 版本支持文档 目的&#xff1a; 在MacOS Sonoma 系统上安装 Xcode14.3.1 第一步 先在Xcode下载一个Xcode14.3.1的压缩包 第二步 本地解压Xcode&#xff0c;将外层目录名变更为Xcode_14.3.1&#xff0c;将文件拷贝到 /Applications目录下。 第三步 变更xcode-sel…

Docker基础教程 - 12 常用容器部署-Nginx

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 12 常用容器部署-Nginx 下面介绍一下常用容器的部署。可以先简单了解下&#xff0c;用到再来详细查看。 在 Docker 中部署 Nginx&#xff0c;并通过挂载方式将 Nginx 的配置文件和站点目录挂…

leecode算法二

滑动窗口/双指针 滑动窗口 得到K个黑块的最少涂色次数 滑动窗口法 方法一 方法二 水果成篮 二叉树 概念 中序遍历 前序遍历和后序遍历无非就是把result.add房价加在前面和后面。 层序遍历 广度优先算法 深度优先算法 线段树 我的日程安排表II

Day36:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入

目录 Java-项目管理-工具配置 Java-三方组件-Log4J&JNDI Java-三方组件-FastJson&反射 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用…

[Unity3D]--更换天空盒子

我们原来的天空盒子是这样的。 感觉不是特别满意&#xff0c;想换一个更好看的。 去资源商店找个好看的 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 例如这个 然后在Window>Rendering>Lighting里的环境选项里更换材质 更换&#xff1a; ​ …

SpringBoot注解--08--注解@JsonInclude

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 JsonInclude注解是jackSon中最常用的注解之一&#xff0c;是为实体类在接口序列化返回值时增加规则的注解 1.JsonInclude用法2.JsonInclude注解中的规则有 案例需求…

卷积神经网络CNN(一篇文章 理解)

目录 一、引言 二、CNN算法概述 1 卷积层 2 池化层 3 全连接层 三、CNN算法原理 1 前向传播 2 反向传播 四、CNN算法应用 1 图像分类 2 目标检测 3 人脸识别 六、CNN的优缺点 优点&#xff1a; 1 特征提取能力强 2 平移不变性 3 参数共享 4 层次化表示 缺点…

机器学习-04-分类算法-01决策树案例

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法开篇与决策树部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

一次因PageHelper引起的多线程复用问题的排查和解决方案

目录导航 导读01.Problem Description02.Problem inspection Steps1. Code Review2. Log Check and Prove 03.Analysis Steps1. How to use PageHelpera. Github Official Document Linkb. Analysis Source Code of PageHelper 2. How to solve the problem 导读 本文不仅对遇…

作用域链的理解(超级详细)

文章目录 一、作用域全局作用域函数作用域块级作用域 二、词法作用域三、作用域链 一、作用域 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变…