关于@TableId(type = IdType.ASSIGN_UUID)和@Param注解同时存在,雪花算法失效的问题

在今日份代码书写过程中,mapper层

int addInterBody( @Param("params") RpaInterfaceBody rpaInterfaceBody);

xml文件部分代码如下:


    <insert id="addInterBody" >
        insert into rpa_interface_body (id,interface_id,type,raw_content,remark,create_time,update_time,del_flag)
        values (#{params.id},#{params.interfaceId},#{params.type},#{params.rawContent},#{params.remark},#{params.createTime},#{params.updateTime},0)
    </insert>

实体层:

@TableId(value = "id",type = IdType.ASSIGN_UUID)
    private String id;

报错如下

ERROR druid.sql.Statement - [statementLogError,149] - {conn-10004, pstmt-20005} execute error. insert into rpa_interface_body (id,interface_id,type,raw_content,remark,create_time,update_time,del_flag)
        values (?,?,?,?,?,?,?,0)

多次检查,发现之前使用插入List时并未出现这种错误

删除@Param注解后尝试,可以运用雪花算法生成id

只找到解决办法,但是不明原因,特此记录,顺便看看有没有大佬能够解答

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL ,可以通过使用第三方库来生成雪花算法的主键ID。比如,可以使用 Twitter 的 Snowflake 算法来生成主键ID。Snowflake 算法生成的主键ID是一个 64 位的整数,其高位是时间戳,间位是机器 ID,低位是序列号。这样可以保证生成的主键ID全局唯一,并且有序递增。在 MySQL ,可以使用类似下面的 SQL 语句来生成 Snowflake ID: ```sql CREATE TABLE `test` ( `id` bigint(20) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `test` (`id`, `name`) VALUES((SELECT next_snowflake_id()), 'test'); ``` 其,`next_snowflake_id()` 是一个自定义的 MySQL 存储过程,用来生成 Snowflake ID。可以将该存储过程定义为如下: ```sql CREATE DEFINER=`root`@`localhost` FUNCTION `next_snowflake_id`() RETURNS bigint(20) DETERMINISTIC BEGIN DECLARE twepoch BIGINT DEFAULT 1288834974657; -- 2006-03-21 20:50:14 DECLARE machine_id BIGINT DEFAULT 0; DECLARE sequence BIGINT DEFAULT 0; DECLARE last_timestamp BIGINT DEFAULT 0; DECLARE current_timestamp BIGINT DEFAULT 0; SET machine_id = (SELECT FLOOR(RAND() * 1024) % 1024); SET last_timestamp = (SELECT UNIX_TIMESTAMP(NOW(3)) * 1000); REPEAT SET current_timestamp = (SELECT UNIX_TIMESTAMP(NOW(3)) * 1000); IF last_timestamp > current_timestamp THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Clock moved backwards'; END IF; IF last_timestamp = current_timestamp THEN SET sequence = (sequence + 1) & 4095; IF sequence = 0 THEN REPEAT SET current_timestamp = (SELECT UNIX_TIMESTAMP(NOW(3)) * 1000); UNTIL current_timestamp > last_timestamp END REPEAT; END IF; ELSE SET sequence = 0; END IF; SET last_timestamp = current_timestamp; UNTIL sequence != 0 END REPEAT; RETURN ((current_timestamp - twepoch) << 22) | (machine_id << 12) | sequence; END ``` 注意,上述存储过程的 `machine_id` 变量是随机生成的,可以根据需要进行修改。另外,Snowflake 算法生成的主键ID是一个长整型,需要使用 `BIGINT` 类型来保存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值