【Spring连载】使用Spring Data访问 MongoDB----类型映射Type Mapping
MongoDB集合可以包含表示各种类型实例的documents。如果存储类的层次结构或具有Object类型属性的类,则此功能非常有用。在后一种情况下,检索对象时必须正确读入该属性中的值。因此,我们需要一种机制来将类型信息与实际document一起存储。
为了实现这一点,MappingMongoConverter使用了一个MongoTypeMapper抽象,并将DefaultMongoTypeMapper作为其主要实现。它的默认行为是将完全限定的类名存储在文档内的_class下。类型提示是为顶级文档以及每个值编写的(如果它是复杂类型和声明的属性类型的子类型)。下面的示例(最后是JSON表示)显示了映射的工作方式:
例1:类型映射
class Sample {
Contact value;
}
abstract class Contact { … }
class Person extends Contact { … }
Sample sample = new Sample();
sample.value = new Person();
mongoTemplate.save(sample);
{
"value" : { "_class" : "com.acme.Person" },
"_class" : "com.acme.Sample"
}
Spring Data MongoDB将类型信息存储为实际根类和嵌套类型的最后一个字段(因为它很复杂,是Contact的子类型)。因此,如果你现在使用mongoTemplate.findAll(Object.class, “sample”),你可以发现存储的document是一个Sample实例。你还可以发现value属性实际上是一个Person。
一、自定义类型映射
如果你希望避免将整个Java类名写入类型信息,但希望使用键,则可以在实体类上使用@TypeAlias注解。如果你需要更多地自定义映射,请查看TypeInformationMapper接口。该接口的实例可以在DefaultMongoTypeMapper上配置,而DefaultMongoTypeMapper又可以在MappingMongoConverter上配置。以下示例显示如何为实体定义类型别名:
例2:定义实体的类型别名
@TypeAlias("pers")
class Person {
}
请注意,生成的document包含pers作为_class字段中的值。
只有当映射上下文知道实际类型时,类型别名才起作用。所需的实体元数据在第一次保存时确定,或者必须通过配置初始实体集提供。默认情况下,配置类扫描基本包以查找潜在的候选者。
@Configuration
class AppConfig extends AbstractMongoClientConfiguration {
@Override
protected Set<Class<?>> getInitialEntitySet() {
return Collections.singleton(Person.class);
}
// ...
}
二、配置自定义类型映射
以下示例显示如何在MappingMongoConverter中配置自定义MongoTypeMapper:
class CustomMongoTypeMapper extends DefaultMongoTypeMapper {
//implement custom type mapping here
}
例3:配置自定义MongoTypeMapper
@Configuration
class SampleMongoConfiguration extends AbstractMongoClientConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Bean
@Override
public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory databaseFactory,
MongoCustomConversions customConversions, MongoMappingContext mappingContext) {
MappingMongoConverter mmc = super.mappingMongoConverter();
mmc.setTypeMapper(customTypeMapper());
return mmc;
}
@Bean
public MongoTypeMapper customTypeMapper() {
return new CustomMongoTypeMapper();
}
}
<mongo:mapping-converter type-mapper-ref="customMongoTypeMapper"/>
<bean name="customMongoTypeMapper" class="com.acme.CustomMongoTypeMapper"/>
注意,前面的例子继承了AbstractMongoClientConfiguration类,并覆盖了MappingMongoConverter的bean定义,我们在这里配置了自定义的MongoTypeMapper。
698

被折叠的 条评论
为什么被折叠?



