主键生成
主键策略
| 策略 | 本数据源的用法 |
|---|---|
| 手工赋值 | 插入前由应用提供主键。 |
| 自增 | 不提供数值型自增主键;文档 ID 的生成与回填使用下文方式。 |
| UUID | 字符主键使用 UUID32 或 UUID36。 |
| 序列 | 不提供序列主键策略。 |
| 自定义 | 使用自定义生成器,在插入前或后处理主键。 |
使用自动生成 ID
插入文档未提供 _id 时,由 MongoDB 插入流程生成;适配器返回该 ID,供 Mapper 写入实体属性。
UserInfo 提供可写的 String id 属性,下面的 Mapper 配置会在插入后回填该属性:
- 方法注解
- Mapper 文件
@Insert(value = "test.user_info.insertOne({name: #{name}})",
useGeneratedKeys = true, keyProperty = "id")
int insert(UserInfo item);
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
test.user_info.insertOne({name: #{name}})
</insert>
调用 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。