集成

pom.xml

<!--   达梦数据库     -->
<dependency><groupId>com.dameng</groupId><artifactId>Dm8JdbcDriver18</artifactId><version>8.1.1.49</version>
</dependency><dependency><groupId>com.dameng</groupId><artifactId>DmDialect-for-hibernate5.0</artifactId><version>8.1.1.49</version>
</dependency><dependency><!--注意:只有这个版本的hibernate兼容达梦数据库 --><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.3.18.Final</version>
</dependency>

application.yml

spring:datasource:url: jdbc:dm://127.0.0.1:5236?schema=xxxxxusername: SYSDBApassword: 123456789type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: dm.jdbc.driver.DmDriverdruid: # 记得将merge-sql相关关闭jpa:properties:hibernate:dialect: org.hibernate.dialect.DmDialect

Entity#id说明

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer id = 0;# IDENTITY:mysql有效
# SEQUENCE:达梦有效

达梦配置 - 基础操作mapper

public interface DmSQLMapper {void on(@Param("tableName") String tableName);void off(@Param("tableName") String tableName);}// 对应的xml
<update id="on">set IDENTITY_INSERT ${tableName} ON;
</update><update id="off">set IDENTITY_INSERT ${tableName} OFF;
</update>

达梦配置 - 自定义保存注解

@Documented
@Target({ElementType.PARAMETER,ElementType.METHOD,ElementType.TYPE_USE,ElementType.TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface DmSave {String[] className() default "";
}

达梦配置 - 保存监听

@Component
@Slf4j
public class DmListener {@Autowiredprivate DmSQLMapper dmSQLMapper;/*** 在保存之前调用*/@PrePersistpublic void prePersist(Object source){String name = source.getClass().getAnnotation(Table.class).name();log.info("表名: " + name);dmSQLMapper.on(name);}/*** 在保存之后调用*/@PostPersistpublic void postPersist(Object source){String name = source.getClass().getAnnotation(Table.class).name();dmSQLMapper.off(name);log.info("表名: " + name);}}

达梦配置 - 日志切面

@Aspect
@Component
@Slf4j
public class DmSystemLogAspect {@Autowiredprivate DmSQLMapper dmSQLMapper;@Pointcut("@annotation(xxx.annotataion.DmSave)")public void controllerAspect(){}@Before("controllerAspect()")public void on(JoinPoint point){// 获取注解中的参数值MethodSignature methodSignature = (MethodSignature)point.getSignature();Method method = methodSignature.getMethod();// 获取注解ActionDmSave annotation = method.getAnnotation(DmSave.class);// 获取了参数类名String[] strings = annotation.className();if (strings.length > 0){// 进行达梦数据库on操作for (String tableName : strings) {log.info("开启类名" + tableName);dmSQLMapper.on(tableName);}}}
}

出现的问题

仅当指定列列表,且SET IDENTITY_INSERT为ON时

说明

默认情况下,达梦数据库是不允许对自增的列(例如:id)进行插入操作的。如果使用mybatis手动sql进行insert,应该不会出现很大的问题。但是,使用 jpa 进行save或者saveAll的都是实体,默认是携带id字段的(虽然为null或者0),但是还是报错。

解决

在保存之前,使用语句 set IDENTITY_INSERT ${tableName} ON 即可解决问题,就像上面的mapper文件一样,每次save或者saveAll之前手动调用一次,或者使用监听器或者切面统一进行处理

在同一个数据库连接中,同时只能针对一张表进行该操作的开启,如果开启下一张表,那么上一张会自动关闭

另外一种情况

如果使用了该语句,还没解决问题,注意是否在方法或者类上加了事务注解(@Transactional)
例如:

@Transactional(rollbackFor = Exception.class)
public void saveData(){dmSQLMapper.on("user");userRepository.save(user);dmSQLMapper.on("user_role");userRoleRepository.saveAll(userRoleList);
}

在上面这个案例中,虽然save或saveAll之前,都对相应的表进行了开启,但是执行时,还是会报出 SET IDENTITY_INSERT 的错误。
这是因为在开启了事务之后,sql语句的执行顺序发生了变化,真正需要保存数据的sql放到了对数据不产生影响的sql的后面,而且这种错误很难发现,在控制台是打印不出来的,只有在开启了SQL打印的情况下,跟踪每一条sql才会发现。

认为SQL执行的顺序:

  1. set IDENTITY_INSERT user ON
  2. insert into user(id, name) values(0, “zhangsan”)
  3. set IDENTITY_INSERT user_role ON
  4. insert into user_role(id, user_id, role_id) values(0, 1, 1)

实际SQL执行顺序:

  1. set IDENTITY_INSERT user ON
  2. set IDENTITY_INSERT user_role ON
  3. insert into user(id, name) values(0, “zhangsan”) # 在此处就报错了
  4. insert into user_role(id, user_id, role_id) values(0, 1, 1)

就很无语。。。。。。

springboot集成达梦数据库及SET IDENTITY_INSERT为ON时问题相关推荐

  1. 达梦DCA之SpringBoot集成达梦数据库

    受"华为.中兴事件"影响,我国科技尤其是上游核心技术受制于人的现状对我国经济发展.社会稳定等都提出了严峻考验.大力发展科技产业,鼓励科技创新,成为当下时不我待的命题.中美贸易战以来 ...

  2. Liquibase集成达梦数据库、Activiti集成达梦数据库

    Liquibase集成达梦数据库 一.Liquibase适配达梦数据库 Jhipster项目下,Liquibase集成达梦数据库会报一系列错误,例如: 类型不支持.数据库字段使用到了保留字.主键自增等 ...

  3. nacos2.2.1集成达梦数据库

    nacos2.2.1集成达梦数据库 1.下载源码 https://github.com/alibaba/nacos 2.新增达梦驱动依赖 父pom.xml <dm-driver.version& ...

  4. 纯国产环境JAVA程序(Springboot + Mybatis + 达梦数据库)搭建

    目录 JAVA程序搭建 前言 达梦数据库安装(WINDOWS) SpringBoot项目搭建 整合达梦数据库 源码 总结 JAVA程序搭建 前言 写在前面: 文章满满干货,每一步都是自己从零开始操作并 ...

  5. springboot+mybatisplus+达梦数据库

    springboot+mybatisplus+达梦数据库 1 达梦安装 2 springboot项目适配 2.1 pom依赖 2.2 数据库配置信息 3 注意事项 4 问题汇总 4.1 dbType ...

  6. springboot连接达梦数据库

    springboot连接达梦数据库 这次实战主要说springboot项目连接达梦数据库. 先准备好达梦数据库的驱动包,如下: 在执行maven命令把该驱动包安装到自己的maven仓库,命令如下: m ...

  7. springBoot+mybaits+达梦数据库

    近年,随着国家的呼应,越来越多的国企相关企业都面临着技术转型,其中数据库也渐渐从mysql.Oracle...转到国内呼声最高的达梦数据库:开发阶段使用一个相对陌生点的数据库还不是什么困难的业务实现, ...

  8. ABP入门教程之集成达梦数据库

    达梦数据库目前(2023年)只支持到.net6 所以下载ABP的.net6版本,然后开始集成 1,修改数据库连接 首先在达梦数据库中新建一个用户:ABPDEMO,赋予DBA权限,然后把appsetti ...

  9. Springboot + 国产达梦数据库

    一.原有架构采用mysql,由于信创环境,需要更换国产的数据库 步骤如下 1.确定JDK版本选择对应的达梦数据库版 /**************************************** ...

最新文章

  1. OpenCV中cvBlobsLib的编译与使用
  2. 紧急提醒!售价3980,成本价80,你被坑过吗?
  3. Java核心技术卷I基础知识3.6.6 码点与代码单元
  4. 2020,你收获了什么?又失去了什么?
  5. 实用​Android开源项目及库​
  6. 游戏开发流程及QA职责
  7. html5页面设计技术,H5页面设计技巧有哪些?-鱼爪网
  8. kali 安装volatility_Linux下内存取证工具Volatility的使用
  9. Android 之 APP上架应用宝平台
  10. C++ UTF8 互转 Unicode
  11. VMware win7 x64虚拟机安装
  12. 用python3+ PyQt5写一个NFC模块的串口小工具的一星期
  13. PMP计算(带例题)
  14. 模拟手机通讯录联系人功能
  15. MySQL--入门篇:MySQL入门必会知识 Windows安装MySQL的zip包 一步一步带你图解安装MySQL过程 详细图解MySQL语句
  16. 普通克里金插值的详细计算步骤,适合初学者。
  17. mysql-介绍及增删改查
  18. 实例讲解电源高频变压器的设计方法
  19. 传感器技术(徐科军 第四版)第一章 绪论
  20. 项目制作——个人相册

热门文章

  1. css 外弧_css圆弧边框
  2. SQL创建视图注意事项
  3. 使用SQL创建视图和存储过程
  4. 陷波超宽带天线理论学习
  5. python100day - 07day-集合、字符串和字符
  6. NetCore 3.0 以上版本使用Swagger生成Api说明文档及升级报错原因
  7. Stata面板设置与面板数据多元线性回归与泊松回归命令
  8. 面试阿里测试开发,面试结束后,还被面试官在朋友圈吐槽“什么阿猫阿狗都敢来面试大厂了吗?”
  9. 操作系统-内存管理-虚拟内存管理
  10. contrib-concat