Mybatis-Plus的@TableId注解type = IdType.ASSIGN_UUID和被删除的type = IdType.UUID有什么区别?
数据库中id字段没有设置为主键并且没有序列,使用type = IdType.UUID的时候updateBatchById报错:没有序列,使用type = IdType.ASSIGN_UUID则没有问题
参考ChatGPT部分内容:
Mybatis-Plus的@TableId注解type属性用于指定主键生成策略,其中IdType.ASSIGN_UUID表示使用UUID作为主键,IdType.UUID也表示使用UUID作为主键,但是它会在数据库中创建一个序列来生成UUID,因此在没有序列的情况下使用IdType.UUID会报错。
你的情况,由于数据库中id字段没有设置为主键并且没有序列,因此使用IdType.UUID会报错。而使用IdType.ASSIGN_UUID则不需要在数据库中创建序列,因此可以正常使用updateBatchById方法。
总之,如果你想使用UUID作为主键,且数据库中没有序列,建议使用IdType.ASSIGN_UUID。如果数据库中有序列,可以使用IdType.UUID。
@TableId注解是Mybatis-Plus中用于标识实体类中主键字段的注解。其中,type属性用于指定主键生成策略。
当type = IdType.UUID时,Mybatis-Plus会使用UUID作为主键生成策略。这意味着每次插入一条记录时,都会生成一个新的UUID作为主键。而当使用updateBatchById方法时,Mybatis-Plus会尝试一次性更新多条记录,但由于没有序列,所以会报错。
当type = IdType.ASSIGN_UUID时,Mybatis-Plus会使用雪花算法生成一个唯一的ID作为主键。这个ID是在Java代码中生成的,而不是在数据库中生成的。因此,使用updateBatchById方法时不会出现没有序列的问题。
总的来说,使用type = IdType.ASSIGN_UUID可以避免使用type = IdType.UUID时可能出现的问题。但需要注意的是,如果使用了分布式系统,可能会出现ID重复的问题,需要进行额外的处理。
分配ID(主键类型为 Number(Long和Integer) 或 String)(since 3.3.0),使用接口 IdentifierGenerator 的方法 nextId(默认实现类为 DefaultIdentifierGenerator 雪花算法)。例如:
1 2 3 4 5 6 7 8 |
|
执行 insert 方法,输出日志如下:
1 2 |
|
上面日志中的 user_id “1315523711071158273” 是通过调用 DefaultIdentifierGenerator 的 nextId 方法获取。