默认映射MongoConverter向数据库中的每个对象添加自定义类型键(“_class”)。所以,如果我创建一个人:
package my.dto;
public class Person {
String name;
public Person(String name) {
this.name = name;
}
}
并将其保存到数据库:
MongoOperations ops = new MongoTemplate(new Mongo(), "users");
ops.insert(new Person("Joe"));
mongo 中的结果对象将是:
{ "_id" : ObjectId("4e2ca049744e664eba9d1e11"), "_class" : "my.dto.Person", "name" : "Joe" }
问题:
将 Person 类移动到不同的命名空间会产生什么影响?
是否可以不使用“_class”键污染对象;不为 Person 类编写一个独特的转换器?
故事是这样的:我们默认添加类型作为某种提示实际实例化什么类。因为您必须通过管道输入类型才能将文档读入其中MongoTemplate
无论如何,有两种可能的选择:
- 您提交一个可以分配给实际存储类型的类型。在这种情况下,我们考虑存储类型,将其用于对象创建。这里的经典示例是进行多态查询。假设你有一个抽象类
Contact
和你的Person
。然后您可以查询Contact
s 和我们基本上have to确定要实例化的类型。
- 另一方面,如果您传递完全不同的类型,我们只需将其编组为给定类型,而不是实际存储在文档中的类型。这将涵盖您的问题,如果您移动类型会发生什么。
您可能有兴趣观看这张票 https://jira.springsource.org/browse/DATADOC-63其中涵盖了某种可插入类型映射策略,用于将类型信息转换为实际类型。这可以简单地达到节省空间的目的,因为您可能希望将长限定类名减少为几个字母的散列。它还允许更复杂的迁移场景,在这些场景中,您可能会发现另一个数据存储客户端生成的完全任意类型键并将它们绑定到 Java 类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)