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

时间:2016-11-16 19:36:38

标签: java mongodb orm morphia

我的公司使用mongodb连接到我们的java项目和morphia用于ORM的东西。最近我们对代码库进行了一些重构,包名称也发生了变化。不幸的是,重命名包导致了EXISTING数据库的问题。因为我们的客户已经投入生产,所以我们无法告诉他们擦除数据库并在我们更新产品时重新开始。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我怀疑结果是正确的,问题在于虽然实体不需要className,但对象类型的嵌入对象要求对象具有className,因此morphia可以将它们反序列化为正确的类。所以我尝试的两种方法基本上都是正确的。

解决方案是:

  • 实体的类应具有noClassnameStore注释。
  • 嵌入对象的类应该具有concreteClass 注解。
  • 更新脚本应更新className字段 那些需要它的嵌入式对象。
  • 更新脚本应删除其他所有的className字段。