使用r2dbcEntityTemplate.insert插入数据提示Nested entities are not supported如何解决?
问题原因
Spring Data R2DBC 原生实体映射不支持直接嵌套其他实体类型的属性,你在batch实体中定义了batchDetailEntity类型的成员属性,r2dbcEntityTemplate执行插入操作时会尝试将所有非忽略属性映射为数据库表列,就会抛出Nested entities are not supported错误。
解决方案
根据你的业务场景选择对应方案即可:
方案1:主表子表分开存储(1对1/1对多关联场景)
如果batch和batchDetailEntity对应两个独立的数据库表,使用关联字段做关联:
- 移除
batch实体中batchDetailEntity类型的属性,仅保留和batch表字段对应的基础类型属性 - 在
batchDetailEntity实体中新增batchId字段,用来关联batch表的主键 - 插入操作分步执行,先插入主表
batch记录,拿到生成的主键后赋值给子表的batchId字段,再插入子表记录
示例代码:
r2dbcEntityTemplate.insert(Batch.class) .using(batch) .flatMap(savedBatch -> { // 关联主表主键 batchDetailEntity.setBatchId(savedBatch.getId()); return r2dbcEntityTemplate.insert(BatchDetailEntity.class).using(batchDetailEntity); }) // 后续业务处理 .subscribe();
方案2:嵌套实体以JSON格式存储在单表列中
如果batchDetailEntity的所有内容只需要存在batch表的一个JSON类型字段里:
- 自定义JSON类型转换器,实现
BatchDetailEntity和JSON字符串的互相转换 - 给
batch实体中的嵌套属性添加@Column和@Convert注解,指定转换器
示例代码:
// 实体字段配置 @Column("detail_info") @Convert(converter = BatchDetailJsonConverter.class) private BatchDetailEntity batchDetailEntity;
方案3:嵌套属性仅用于业务逻辑不参与持久化
如果这个嵌套属性只是业务层临时组装数据用,不需要存储到数据库:
- 给该属性添加
@Transient注解,R2DBC会自动忽略该属性的数据库映射
示例代码:
@Transient private BatchDetailEntity batchDetailEntity;
内容的提问来源于stack exchange,提问作者Debabrata Palai
相关产品推荐
相关产品推荐

