当前使用版本(必填,否则不予处理)

3.4.3.4

该问题是如何引起的?(确定最新版也有问题再提!!!)

因为 Kotlin 语言明确限制非空类型,而数据库主键通常都是非空的,因此我们常常定义这样的 id:

data class Entity(
     @TableId(...)
     val id: Long,
    //...
)

这样的定义要求每次初始化实体类的时候必须传一个值(通常为0),但是当前版本的 ASSIGN_ID 对于这样的值不会做自动填充,因此即使配置了雪花算法也不会生效,需要每次自行赋值,非常繁琐。

重现步骤(如果有就写完整)

  1. 创建一个 kotlin demo 工程。
  2. 定义一个 kotlin 实体类,其 id 非空。
  3. 实例化一个实体(id 赋值为 0),并调用 mapper 方法存储到数据库。
  4. 验证 id 字段是否为雪花 id。

按如上步骤执行,最后得到的 id 为 0,证明并未被填充雪花 id,且第二次插入会报 id 0 重复;但如果在第二步将 id 定义为可空类型,则雪花填充功能正常生效。(即可排除工程、语言、依赖包版本等区别)

Comment From: miemieYaho

val id: Long?,

Comment From: GIfted-Jarvis

id 作为不可能为 null 的字段, 用 Long? 来表示不太好