微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 使SpringData更新仅更改POJO的字段

我在MongoDB上使用Spring Data.我能够保存POJO,更新它们.它工作正常.但是现在我想在db中仅刷新POJO的更改字段.

例如,我有用户实体.我创建用户,然后不时更新lastActiveDate.

@Document
class User {
    @Id
    BigInteger ID;

    String email;

    String name;

    Date lastActiveDate;
}

User user = new User();
user.setName("User");
user.setEmail("example@example.com");
repository.save(user);

User toUpdUser = repository.findOne(userId);
toUpdUser.setLastActiveDate(new Date);
repository.save(toUpdUser );

在第二次保存中,我希望仅更新lastActiveDate字段而不是整个用户,因为文档更新在大型实体上可能很慢.另外我想知道changeset(至少是更新字段集).

目前我没有找到API来做到这一点.唯一的可能性是在setter中手动处理它(存储已更改字段的集合并手动存储)但它看起来很丑陋且不受支持.另一种选择是在bean上使用AOP来实现相同的结果,但是IFAIK Spring Data不会将POJO视为Spring bean并且使用构造函数,因此在使用AOP加载POJO之后将只是POJO.

UPD:
 我正在寻找没有明确的mongo api(或mongo-like api)调用方法.我有几十个领域的实体,客户几乎可以改变任何一个.我想只存储已更改的字段,并能够获取更改集以执行某些检查.实体存储和字段更新之间的差异太大 – 5ms vs 0.2ms

当然,我可以使用CRUD跟踪器支持创建自己的POJO映射器实现,但它已经存在,为什么不尝试它.而且我不仅可以使用另一个框架SpringData.

解决方法:

Spring-data不支持逐字段比较,以便确定哪些字段已更新并仅将这些字段发送到数据库.我确实只支持持久化非空字段,我发现自己在实现PATCH或PUT Web服务时会利用它.使用非空字段创建$set对象,您将保持文档的其他部分不变.

您需要使用MongoConverters的一些未记录的功能,这里是spring-mvc中PATCH-webservice的一个示例,它还在文档的“events”数组中维护事件的历史记录:

@RestController
public class MyWebservice {

    @Autowired
    private MongoConverter mongoConverter;

    @RequestMapping(value = "/order/{id}", method = PATCH, produces = APPLICATION_JSON_UTF8_VALUE, consumes = APPLICATION_JSON_UTF8_VALUE)
    public Order updateOrder(@PathVariable("id") String id, @RequestBody Order order) throws JsonProcessingException {
        order.setId(id);
        DBObject update = getDbObject(order);
        mongoTemplate.updateFirst(query(where("id").is(id)), Update.fromDBObject(new BasicDBObject("$set", update)).push("events", order), Order.class);
        return mongoTemplate.findOne(query(where("id").is(id)), Order.class);
    }

    private DBObject getDbObject(Object o) {
        BasicDBObject basicDBObject = new BasicDBObject();
        mongoConverter.write(o, basicDBObject);
        return basicDBObject;
    }
}

MongoConverter只会将非空值写入BasicDBObject.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐