使用MongoRepository操作MongoDB过程中遇到的坑

在开发MongoDB的REST API过程中,遇到了不少坑。话不多说,直接上。

 

坑1、为了获取每条数据的"_id"字段时,使用了@Field("_id")注解作为别名。

read时没问题,但会导致MongoRepository的insert方法序列化失败,产生异常“Required identifier property not found for class”。

解决方法:用注解@Id替换@Field

2、create时,不在本地生成ObjectId,而是利用MongoDB自动生成。

cteate方法会序列化对象,如果对象中包含_id字段(见坑1),就会将该字段一起序列化到MongoD中,且其值为空。为了不序列化这个字段,我给它打上注解@Transient。此时序列化倒是没有问题了,但会导致无法获取该字段,例如findById方法返回的对象中_id字段为空。

解决方法:取消@Transient注解,并且在使用insert方法插入数据之前,在本地生成ObjectId即可。代码如下:

/**
 * Description:CRUD之Create
 *
 * @param entity
 * @return entity
 * @author example@gmail.com
 * @Date 2019/1/30 15:40
 */
@Override
public Entity createEntity(Entity entity) {
    try {
        ObjectId objectId = new ObjectId();
        intent.setIntentId(objectId.toString());
        return intentRepository.insert(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

new ObjectId()会保证生成全局唯一的_id。参考https://www.jianshu.com/p/dd63b93a5955

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值