我使用简单的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模式中的某些内容发生更改时(比如重命名此字段),我会在提及此字段的所有查询中(理想情况下)编译错误。
目前的情况是,对模式的更改不会导致编译器错误 - 更严重的是 - 通常不会导致运行时错误。旧的字符串查询只是静静地返回没有结果或类似的东西。这使得对架构的更改很难实现。
如何正确完成?
答案 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中搜索该字段的用途(或尝试对其进行重构)时,它也会自动找到这些位置。