由于本人一直用的tkmybatis,在学习shardingSphere的过程中。发现如果用主键作为分片策略,就算指定了用雪花算法,实际上是无效的。

原因是ShardingSphere只有当你的传递的字段没有值的时候才会去使用雪花算法生成id,所以实际使用会出错

实体类

@Data
public class TStudent implements Serializable {@Id
//    @Column(insertable = false)private Long id;private String name;private Integer age;private String address;private static final long serialVersionUID = 1L;}

调用insert方法

    @Testpublic void addStudents(){for(int i = 0 ; i < 10 ; i ++){TStudent c = new TStudent();c.setAddress("安徽省合肥市");c.setAge(new Random().nextInt(100));c.setName("学生"+i);tStudentDao.insert(c);}selectStudents();}

执行结果

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error updating database.  Cause: java.lang.IllegalArgumentException: Sharding value must implements Comparable.
### The error may exist in com/xxx/study/shardingsphere/dao/TStudentDao.java (best guess)
### The error may involve com.xxx.study.shardingsphere.dao.TStudentDao.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO t_student  ( id,name,age,address ) VALUES( ?,?,?,? )
### Cause: java.lang.IllegalArgumentException: Sharding value must implements Comparable.at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)at com.sun.proxy.$Proxy59.insert(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)at com.baomidou.mybatisplus.core.override.PageMapperMethod.execute(PageMapperMethod.java:68)at com.baomidou.mybatisplus.core.override.PageMapperProxy.invoke(PageMapperProxy.java:64)at com.sun.proxy.$Proxy70.insert(Unknown Source)at 

提示错误就是分片键的值不能为空。

解决方法有以下几种:

1、将id字段在insert时不做传入字段,加上这样的注解,tkmybatis在解析sql时就会跳过id字段了

    @Column(insertable = false)private Long id;

2、直接实现一个类似的雪花算法,使用@keysql。由于此处主要说tkmybaitis的问题,就不上传雪花算法的代码了。

    @Id
//    @Column(insertable = false)@KeySql(genId = SnowFlake.class)private Long id;

3、还有一种方式,直接在给对象赋值的时候,将主键Id直接塞值

            TStudent c = new TStudent();c.setId(new SnowFlake(1l,1l).nextId(false));c.setAddress("安徽省合肥市");c.setAge(new Random().nextInt(100));c.setName("学生"+i);tStudentDao.insert(c);

4、最后推荐另外一个方式,如果是新项目的话

建议使用mybatis plus来代替tk mybatis。plus的社区比tk活跃多了。更新的也快

tkmybatis+shardingSphere的插入问题相关推荐

  1. shardingsphere分表导致text无法插入

    org.apache.shardingsphere sharding-jdbc-spring-boot-starter 4.0.0-RC1 使用这个包,插入text类型,如果xml文件写了jdbcTy ...

  2. Mysql的分库分表(基于shardingsphere)

    一.名词解释 库:database:表:table:分库分表:sharding 二.数据库架构演变 刚开始我们只用单机数据库就够了,随后面对越来越多的请求,我们将数据库的写操作和读操作进行分离, 使用 ...

  3. 分布式事务在Sharding-Sphere中的实现

    分布式事务的使用场景 01 ACID 一切从ACID开始说起.ACID是本地事务所具有的四大特征: Atomicity:原子性 事务作为整体来执行,要么全部执行,要么全不执行. Consistency ...

  4. SpringBoot + ShardingSphere 秒级分库分表!

    Spring Boot 作为主流微服务框架,拥有成熟的社区生态.市场应用广泛,为了方便大家,整理了一个基于spring boot的常用中间件快速集成入门系列手册,涉及RPC.缓存.消息队列.分库分表. ...

  5. server sql 水平分表_springboot集成Shardingsphere进行分库分表

    当公司业务量上去之后,单表支撑不了的时候,分库分表就是一个绕不开的话题,小弟最近新入职一家公司,发现这边公司在用ShardingSphere来进行分库分表,之前没接触过这方面,所以就写了个demo学习 ...

  6. 高性能分布式事物中间件Sharding-Sphere介绍

    原作者:Sharding-Sphere 转载来源:http://shardingsphere.io/index.html  , https://github.com/sharding-sphere/s ...

  7. ShardingSphere(二) 水平分表配置搭建,实现分表写入读取

    概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...

  8. 分库分表解决方案之ShardingSphere

    本文来说下ShardingSphere中间件是如何来解决分库分表问题的 文章目录 概述 Sharding-JDBC简介 与常见开源产品对比 实现原理 分片规则配置 JDBC规范重写 SQL解析 SQL ...

  9. ShardingSphere JDBC 语句执行初探

    简介 在前几篇文中,我们基于源码就ShardingSphere的核心功能给运行了一遍,本篇文章开始,我们开始探索源码,看看ShardingSphere是如何进行工作的 概览 开始之前,我们先思考这次探 ...

最新文章

  1. python使用matplotlib绘制水平条形图并在条形图上添加实际数值标签实战
  2. Android布局之weight属性解析
  3. Jquery高亮显示文本中重要的关键字
  4. 错误602,未能在sysindexes中找到数据库 的解决办法
  5. ABAP性能优化之使用二分查找(Binary Search)选项
  6. [转]FlashSocket通信安全策略一点心得
  7. CodeForces - 1095C Powers Of Two(思维)
  8. Python分析「我们为什么这么穷」
  9. Spark 学习(六) Spark 的线程安全和序列化问题
  10. 华为云内容审核—性能更加狂野,价格更加腼腆
  11. HTML绘制机器人代码,C#编写机器人PCSDK程序-界面程序上画机器人跟着画
  12. mysqld_exporter报错Error 1146: Table 'my2.status' doesn't exist
  13. linux7.3系统如何修改系统时间,两招修改​Centos7 系统时区!
  14. CF633C:Spy Syndrome 2——题解
  15. ansys18.0安装教程
  16. 《硬件接入》海康威视接入及CPU性能优化思路
  17. AB余商c语言编程答案,C语言课后题编程答案
  18. LINUX实验---网络管理
  19. 怎么查充电器支不支持pd快充协议_新买的iPhone11不能快充?很可能是因为你没用对充电器...
  20. 3手机版怎么换行_敬业签手机版便签软件怎么绑定QQ或微信互联登录?

热门文章

  1. less加管道tail_第二天作业
  2. 成都敏之澳:拼多多标题怎么找词?
  3. idea连接ECS以及同步
  4. P2910Clear And Present Danger S(Floyd算法)C++
  5. 大卫谈学习4:为何你会一年经验用十年?
  6. Jetson AGX Orin 刷机采坑全过程
  7. Eclipse代码GUI导出桌面双击运行
  8. 比运动控制卡更快、更稳的YKCAT2(下)
  9. java 习题_java经典选择题100例及答案
  10. 用Python实现两数之和(python)