使用POJO类作为mongo db的模式,专门处理模式更改

时间:2017-04-30 07:26:14

标签: java json mongodb serialization database-design

我使用简单的Java类,它是我的mongo db表的模式。 有几个框架用于序列化/反序列化到/来自JSON和CRUD操作的mongo(我已经看过Jackson序列化器和Morphia)。 但它们似乎都没有提供处理变更的解决方案:

我们说我有这个类作为我的架构:

Class Person
{
  String name;
  int age;
  String occupation;
}

在我的代码中,我可能会在某个地方使用setter来代表年龄:

Person newDbEntry = new Person();
newDbEntry.setAge(45);
newDbEntry.setOccupation("Carpenter");

现在让我们说,在开发过程的某个阶段,决定将年龄字段名称更改为" theAge",并且还决定删除&#34 ;职业"完全从这个集合中的字段到新表。

我遇到的问题是我的所有查询都是这样的:

JsonObject query = new JsonObject().put("age",new JsonObject().put("$gte", 22);

换句话说,所有字段名称都以字符串(以及所有其他mongo API-update,findAndModify等)写入查询。

我正在寻找一种方法来约束"所有提到的领域"年龄"在我的POJO类代码中 - 这样当POJO模式中的某些内容发生更改时(比如重命名此字段),我会在提及此字段的所有查询中(理想情况下)编译错误。

目前的情况是,对模式的更改不会导致编译器错误 - 更严重的是 - 通常不会导致运行时错误。旧的字符串查询只是静静地返回没有结果或类似的东西。这使得对架构的更改很难实现。

如何正确完成?

1 个答案:

答案 0 :(得分:0)

这是我最终使用的解决方案: 龙目岛项目现在支持FieldNames生成: https://projectlombok.org/features/experimental/FieldNameConstants

因此,不要使用硬编码为字符串的名称:

serviceRepository.setField(id, “service.serviceName”, “newName”);

我使用:

serviceRepository.setField(id, ConnectivityServiceDetails.Fields.service + "." + ConnectivityService.Fields.serviceName, “newName”);

这样,当我们在Intellij中搜索该字段的用途(或尝试对其进行重构)时,它也会自动找到这些位置。