Spring Data MongoDB嵌套多类型对象持久化的推荐方案问询
在MongoDB/Spring环境下处理多类型嵌套对象的推荐方案
业务场景
在MongoDB中存储深度嵌套对象时,部分字段存在多种类型。例如某对象的字段为InterfaceType接口类型,该接口有ConcreteTypeA、ConcreteTypeB等不同实现类,且各实现类的字段结构不同。
对应Kotlin代码
package foo.bar sealed interface InterfaceType data class ConcreteTypeA(val aField1: String, val aField2: Int) : InterfaceType data class ConcreteTypeB(val bField: List<String>) : InterfaceType
Spring Data MongoDB实体类
package bar.foo @Document("myCollection") data class MyDocument( @Id id: String, val value: InterfaceType )
默认持久化行为
Spring Data MongoDB会自动添加_class字段,用于读取文档时实例化正确的类。持久化后的JSON数据示例如下:
{ "value" : { "aField1" : "some value", "aField2" : 1234, "_class" : "foo.bar.ConcreteTypeA" }, "_class" : "bar.foo.MyDocument" }
存在的问题
该方案可正常运行,但存在重构不安全的问题:当重命名类或移动类的包路径后,读取原有文档会失败。
当前可选方案
- 使用
@TypeAlias注解并在配置中注册别名类:只要不修改注解中的常量值,即可支持类重命名或包迁移 - 在Document类中设置大量可空字段,在Repository层自行处理所有类型转换逻辑
问题
请问在MongoDB/Spring环境下,处理此类多类型嵌套数据结构的推荐方案是什么?
内容的提问来源于stack exchange,提问作者Ranil Wijeyratne
相关产品推荐
相关产品推荐

