Aerospike整合Spring时主键PK类型为何始终变为varchar类型
问题成因
- Spring Data Aerospike 默认的主键序列化逻辑不会识别
@Id字段声明的Java类型,默认会把所有主键统一转成字符串格式写入Aerospike,不会存为原生整数类型。 - aql查询结果里PK值带双引号就是字符串类型的典型表现,Aerospike中整数类型主键返回时不会包裹双引号。
- 额外排查点:实体类
@Document注解标注的collection是user_repo,但aql查询的是test集合,如果不是手动切换了查询目标,要确认是不是有其他写入逻辑往test集合写数据,避免测试对象搞错。
解决方案
- 自定义主键转换器覆盖默认逻辑
实现Aerospike的读写转换器,指定整数类型主键直接序列化为Aerospike原生整数Key,参考代码如下:
将两个转换器注册到Spring Data Aerospike的// 主键写入转换器:Java Integer -> Aerospike 整数类型Key @WritingConverter public class IntegerKeyWriteConverter implements Converter<Integer, Key> { @Override public Key convert(Integer source) { return new Key(Key.KeyType.INTEGER, source); } } // 主键读取转换器:Aerospike Key -> Java Integer @ReadingConverter public class IntegerKeyReadConverter implements Converter<Key, Integer> { @Override public Integer convert(Key source) { return source.getValue().intValue(); } }MappingAerospikeConverter配置中,替换默认的字符串转换逻辑即可。 - 适配默认逻辑
如果对主键底层存储类型没有强制要求,可以直接把实体类@Id字段类型改为String,Repository接口的主键泛型也同步改为String,和框架默认序列化逻辑对齐,不会影响正常CRUD使用,仅底层存储为字符串类型。 - 校验方式:配置完成后重新插入测试数据,用aql查询时PK列显示为不带双引号的纯数字,即代表主键已按整数类型正常存储。
内容的提问来源于stack exchange,提问作者Riccio
相关产品推荐
相关产品推荐

