tkmybatis+shardingSphere的插入问题
由于本人一直用的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的插入问题相关推荐
- shardingsphere分表导致text无法插入
org.apache.shardingsphere sharding-jdbc-spring-boot-starter 4.0.0-RC1 使用这个包,插入text类型,如果xml文件写了jdbcTy ...
- Mysql的分库分表(基于shardingsphere)
一.名词解释 库:database:表:table:分库分表:sharding 二.数据库架构演变 刚开始我们只用单机数据库就够了,随后面对越来越多的请求,我们将数据库的写操作和读操作进行分离, 使用 ...
- 分布式事务在Sharding-Sphere中的实现
分布式事务的使用场景 01 ACID 一切从ACID开始说起.ACID是本地事务所具有的四大特征: Atomicity:原子性 事务作为整体来执行,要么全部执行,要么全不执行. Consistency ...
- SpringBoot + ShardingSphere 秒级分库分表!
Spring Boot 作为主流微服务框架,拥有成熟的社区生态.市场应用广泛,为了方便大家,整理了一个基于spring boot的常用中间件快速集成入门系列手册,涉及RPC.缓存.消息队列.分库分表. ...
- server sql 水平分表_springboot集成Shardingsphere进行分库分表
当公司业务量上去之后,单表支撑不了的时候,分库分表就是一个绕不开的话题,小弟最近新入职一家公司,发现这边公司在用ShardingSphere来进行分库分表,之前没接触过这方面,所以就写了个demo学习 ...
- 高性能分布式事物中间件Sharding-Sphere介绍
原作者:Sharding-Sphere 转载来源:http://shardingsphere.io/index.html , https://github.com/sharding-sphere/s ...
- ShardingSphere(二) 水平分表配置搭建,实现分表写入读取
概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...
- 分库分表解决方案之ShardingSphere
本文来说下ShardingSphere中间件是如何来解决分库分表问题的 文章目录 概述 Sharding-JDBC简介 与常见开源产品对比 实现原理 分片规则配置 JDBC规范重写 SQL解析 SQL ...
- ShardingSphere JDBC 语句执行初探
简介 在前几篇文中,我们基于源码就ShardingSphere的核心功能给运行了一遍,本篇文章开始,我们开始探索源码,看看ShardingSphere是如何进行工作的 概览 开始之前,我们先思考这次探 ...
最新文章
- python使用matplotlib绘制水平条形图并在条形图上添加实际数值标签实战
- Android布局之weight属性解析
- Jquery高亮显示文本中重要的关键字
- 错误602,未能在sysindexes中找到数据库 的解决办法
- ABAP性能优化之使用二分查找(Binary Search)选项
- [转]FlashSocket通信安全策略一点心得
- CodeForces - 1095C Powers Of Two(思维)
- Python分析「我们为什么这么穷」
- Spark 学习(六) Spark 的线程安全和序列化问题
- 华为云内容审核—性能更加狂野,价格更加腼腆
- HTML绘制机器人代码,C#编写机器人PCSDK程序-界面程序上画机器人跟着画
- mysqld_exporter报错Error 1146: Table 'my2.status' doesn't exist
- linux7.3系统如何修改系统时间,两招修改​Centos7 系统时区!
- CF633C:Spy Syndrome 2——题解
- ansys18.0安装教程
- 《硬件接入》海康威视接入及CPU性能优化思路
- AB余商c语言编程答案,C语言课后题编程答案
- LINUX实验---网络管理
- 怎么查充电器支不支持pd快充协议_新买的iPhone11不能快充?很可能是因为你没用对充电器...
- 3手机版怎么换行_敬业签手机版便签软件怎么绑定QQ或微信互联登录?