跳到主要内容

主键生成

主键策略

策略本数据源的用法
手工赋值插入前由应用提供主键。
自增不提供数值型自增主键;文档 ID 的生成与回填使用下文方式。
UUID字符主键使用 UUID32 或 UUID36。
序列不提供序列主键策略。
自定义使用自定义生成器,在插入前或后处理主键。

使用自动生成 ID

插入文档未提供 _id 时,由 MongoDB 插入流程生成;适配器返回该 ID,供 Mapper 写入实体属性。

UserInfo 提供可写的 String id 属性,下面的 Mapper 配置会在插入后回填该属性:

@Insert(value = "test.user_info.insertOne({name: #{name}})",
useGeneratedKeys = true, keyProperty = "id")
int insert(UserInfo item);

调用 mapper.insert(item) 后,通过 item.getId() 读取主键。这里使用单个实体参数,不额外加 @Param 包装。

注意

生成键结果集的列名是 _ID;需要显式指定返回列时,设置 keyColumn = "_ID"。查询文档中的主键字段则使用 _id

使用已有 ID

ObjectId 与内容相同的十六进制字符串不是同一种值。查询已有 ObjectId 时,对绑定的字符串使用 ObjectId 包装:

@Query("test.user_info.find({_id: ObjectId(#{id})})")
UserInfo findById(@Param("id") String id);

构造器按 ObjectId 字段查询时,配置:

@Column(value = "_id", primary = true, whereValueTemplate = "ObjectId(?)")
private String id;

这种包装只用于 ObjectId 字段,不用于字符串类型的 _id。

选择回填来源

方法注解和 Mapper 文件均使用 useGeneratedKeys,保持默认回填来源。生成键和命令本身的结果集不是同一个结果;这里的插入不要设置 generatedKeySource="resultSet"

上面的例子展示了可用的生成键回填方式;需要指定返回列时使用 keyColumn