重构对象 类 后在生产中更新 Morphia/mongodb

Updating Morphia/mongodb in production after refactor of object classes

我的公司使用 mongodb 连接到我们的 java 项目,并使用吗啡来处理 ORM 内容。最近我们对代码库进行了一些重构,包名称也发生了变化。不幸的是,包的重命名导致现有数据库出现问题。因为我们有已经在生产中的客户,所以我们不能真正告诉他们擦除他们的数据库并在我们更新产品时重新开始。

我尝试了两种方法。一种方法是编写一个脚本,将 className 字段的所有具有旧值的条目更新为正确的值。 另一种方法是从所有条目中删除 className 字段,并将 noClassnameStored 注释添加到 class.

这两种方法似乎都不允许在我们产品的新版本下加载现有数据库。我现在在想,也许问题出在我们使用的嵌入式对象上。我们的 "Job" class 有一个名为 parameters 的字段,它使用 JobParameters 作为 class。然后,我们用派生的 classes 填充该字段(例如,MigrationJobParameters extends JobParameters)。这两个 classes(以及 JobParameters 基础 class)都使用 "embedded" 和 "concreteClass=" 注释。 我注意到吗啡继续并将 className 字段添加到数据库对象,这对我来说很有意义。

在一天结束时,Java 抛出一个异常,它无法将 JobParameters 转换为 MigrationJobParameters,这也是有道理的。

所以我的问题是如何更新包含嵌入式对象的现有数据库,这些嵌入式对象在对象的命名空间发生更改后具有继承性。

我的怀疑被证明是正确的,问题是虽然实体不需要 className,但对象类型的嵌入对象要求对象具有 className所以吗啡可以将它们反序列化为正确的 class。所以基本上我尝试的两种方法都是部分正确的。

解决方案是:

  • 实体的 classes 应该有 noClassnameStore 注释。
  • 嵌入对象的 classes 应该有 concreteClass 注解。
  • 更新脚本应更新 class名称字段 那些需要它的嵌入式对象。
  • 更新脚本应删除所有其他所有内容的 class名称字段。