2016-11-16 35 views
0

我的公司使用连接到我们的java项目的morpho for ORM东西的mongodb。最近我们已经对代码库进行了一些重构,包名称也发生了变化。不幸的是,软件包的重命名导致了EXISTING数据库的问题。因为我们有已经在生产的客户,所以当我们更新产品时,我们无法真正告诉他们擦拭他们的数据库并重新开始。在对象类的重构之后更新生产中的Morphia/mongodb

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

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

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

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

回答

0

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

解决的办法是这样的:

  • 为实体的类应具有noClassnameStore注释。
  • 嵌入对象的类应该具有concreteClass 注释。
  • 更新脚本应更新 需要它的嵌入对象的className字段。
  • 更新脚本应该删除其他所有的className字段。
相关问题