Spring整合MongoDB----类型映射Type Mapping

【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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值