Morphia:从1.x版本迁移现有数据至2.x版本
Morphia 1.x → 2.x 鉴别器迁移指南
一、先搞定代码兼容(过渡或永久)
你已经在@Entity注解里指定了discriminatorKey="className"和discriminator="Unit",这一步是对的——这会让Morphia 2.x继续使用旧的鉴别器字段名className,而不是默认的_t。但要注意:旧数据里的className存的是全类名(比如app.package.Unit),而你配置的discriminator是短类名Unit,这会导致Morphia无法识别旧数据。
解决这个问题有两种思路:
思路1:修改配置兼容全类名
如果不想动数据库数据,可以把discriminator设置成全类名,同时保留discriminatorKey="className":
@Entity(discriminatorKey = "className", discriminator = "app.package.Unit") public class Unit { @Id private String id; protected Unit() {} public String getId() { return id; } public void setId(String id) { this.id = id; } }
这样Morphia就能直接读取旧数据,新写入的数据也会用全类名作为鉴别器值。
思路2:迁移数据库数据到短类名
如果想统一用短类名作为鉴别器值,就需要批量更新数据库里的文档:
打开MongoDB Shell,执行以下命令(替换your_collection_name为你的实体对应集合名,app.package.Unit为旧的全类名):
db.your_collection_name.updateMany( { className: "app.package.Unit" }, { $set: { className: "Unit" } } )
如果有多个子类,需要逐个对应更新(比如把app.package.SubUnit改成SubUnit)。
二、如果想切换到Morphia 2.x默认的_t键
要是你最终想改用Morphia 2.x的默认鉴别器键_t,可以按以下步骤操作:
- 修改实体类注解:
@Entity(discriminatorKey = "_t", discriminator = "Unit") public class Unit { @Id private String id; protected Unit() {} public String getId() { return id; } public void setId(String id) { this.id = id; } }
- 迁移数据库数据,把旧的
className字段重命名为_t,同时确保值是短类名(如果还没做的话):
// 先把值改成短类名(如果之前没改) db.your_collection_name.updateMany( { className: "app.package.Unit" }, { $set: { className: "Unit" } } ) // 再重命名字段 db.your_collection_name.updateMany( {}, { $rename: { "className": "_t" } } )
三、关键注意事项
- 迁移前一定要备份数据库,避免操作失误导致数据丢失
- 多环境部署的话,要确保所有环境的数据库都完成迁移后,再上线修改后的代码
- 复杂继承体系下,要逐一确认每个子类的鉴别器映射关系,避免出现类映射错误
内容的提问来源于stack exchange,提问作者Sameer Kamran
相关产品推荐
相关产品推荐

