我们知道,如果你用Java的Sping Data 框架映射Pojo为MongoDB数据时,数据库中会自动给你添加一个_class字段,那这个字段是干嘛用的呢?我们可以不可以不要这个字段呢?

直接上结论:答案其实很简答,这个字段就是用来映射Pojo的,更具体的说,是为了方便处理Pojo中存在继承的情况,增加系统的扩展性的,接下来上例子:

_class字段帮助映射子类

为了方便演示,这里用Spring Data 给我们提供的mongoTemplate来操作。有关mongoDB和Spring Data的环境我就不贴了,直接上测试代码:

拥有继承关系的实体类

@Document是把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。

父类Person

@Document(collection = "test")
public class Person { protected String name;
protected int age; //set/get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

子类 Student

@Document(collection = "test")
public class Student extends Person { String a;
String b; @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", a='" + a + '\'' +
", b='" + b + '\'' +
'}';
} public String getA() {
return this.a;
} public void setA(String a) {
this.a = a;
} public String getB() {
return this.b;
} public void setB(String b) {
this.b = b;
}
}

Dao层

Dao接口

public interface PersonDao {
void addPerson(Person person);
Person findPersonByName(String name);
}

Dao实现

@Repository
public class PersonDapImpl implements PersonDao { @Autowired
MongoTemplate mongoTemplate; @Override
public void addPerson(Person person) {
mongoTemplate.save(person);
} @Override
public Person findPersonByName(String name) {
Query query = new Query(Criteria.where("name").is(name));
Person person = mongoTemplate.findOne(query, Person.class);
return person;
}
}

测试方法

public class PersonDapImplTest extends BaseTest {

  @Autowired
PersonDao personDao; @Test
public void addPerson() {
Person person = new Person();
person.setName("张");
person.setAge(10);
personDao.addPerson(person);
} @Test
public void addStudent() {
Student student = new Student();
student.setName("小张");
student.setAge(12);
student.setA("a");
student.setB("b");
personDao.addPerson(student);
} @Test
public void findPerson() {
System.out.println("==============开始查找=============="); Person person = personDao.findPersonByName("小张"); System.out.println();
System.out.println();
System.out.println(); if (person != null) {
System.out.println(person.toString());
}else {
System.out.println("null");
}
}
}

测试结论

测试中,小张是张的子类,mongoDB中已经插入了2条数据:

查询小张,得到的类是Student类吗?

可以看到,最终展示的是Student的详细信息,说明_class能帮助我们反序列化出子类。

那如果去掉了_class列,会是什么样呢?

去掉_class

去掉_class的方法需要配置一下

需要配置MappingConverter:更详细的去掉_class的方法可以参考其他博文。

  @Bean
public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory,
MongoMappingContext context, BeanFactory beanFactory, CustomConversions conversions) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
// remove _class field
// mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
mappingConverter.setCustomConversions(conversions);
return mappingConverter;
}

去掉_class后:

再次查询"小张"

可以看到,mongoDB无法帮助我们来映射子类了。返回的数据被反序列化成了Person类。

MongoDB中_class字段的作用的更多相关文章

  1. mongodb使用_遍历列表中的元素,作为变量,循环修改mongodb中的字段

    一.问题描述: 需要将工作界面上的一些已经离职的用户状态改为失效,并备注为离职 二.需要准备/拿到手的工具/条件/数据: 1.已离职人员名单(excel格式) 2.任意mongodb工具(笔者使用的是 ...

  2. MongoDB中的字段类型Id

    众所周知,在向MongoDB的集合中添加一条记录时,系统会自动增加一个字段名为"_id",类型为ObjectId的字段,其值为24位字符串,可以使用此值作为记录的唯一标识. 项目中 ...

  3. 集合类中modCount字段的作用

    ArrayList.LinkedList.HashMap中都有一个字段叫modCount.这个字段的用途,在ArrayList的父类AbstractList源码中有注释,说的很清楚: /** * Th ...

  4. 【memcached】memcached中flags字段的作用

    我们一般只注意到memcached的数据结构是key,value,今天看memcached源代码的时候,盯上了flags,没看明白.后来问了一下同事,说PHP当中使用flags标记,标识memcach ...

  5. maven中pom文件中name字段的作用

  6. spring mongodb中去掉_class列

    调用mongoTemplate的save方法时, spring-data-mongodb的TypeConverter会自动给document添加一个_class属性, 值是你保存的类名. 这种设计并没 ...

  7. ABAP 数据字典中的参考表和参考字段的作用

         ABAP数据字典中的参考表和参考字段的作用 大家最初在SE11中创建表和结构的时候都会遇到一个问题,如果设定了某个字段为QUAN或者CURR类型,也就是数量或金额的时候,总会要求输入一个参考 ...

  8. spring data mongodb中,如果对象中的属性不想加入到数据库字段中

    spring data mongodb中,如果对象中的属性不想加入到数据库字段中,可加@Transient注解,声明为透明属性 spring data mongodb 官网帮助文档 http://ww ...

  9. SAP MM 物料主数据采购视图中的字段'Var. OUn'的作用?

    SAP MM 物料主数据采购视图中的字段'Var. OUn'的作用? 物料主数据采购视图里有一个字段,叫做'Var. OUn'的, 如下图: 这个字段,笔者之前所参与的项目里,从来没有用过.所以,笔者 ...

随机推荐

  1. oracle上机实验内容

    这是oracle实验的部分代码,我花了一中午做的. 第一次上机内容 实验目的:熟悉ORACLE11G的环境 实验内容: 第二次上机内容 实验目标:掌握oracle体系结构,掌握sqlplus的运行环境 ...

  2. Retrofit 2.0 使用和原理

    使用教程: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1016/3588.html retrofit2 与okhttp关系 ...

  3. Vue, element-ui Module build failed: Error: No PostCSS Config found

    使用vue框架写pc页面时,我们经常会用到element-ui这个框架. 当我们吧把需要的东西都装在好运行项目的时候,有时会出现这样的错误, Module build failed: Error: N ...

  4. Ubuntu下自定义调整CPU工作频率(用于省电或提高性能都好用)

    昨天高铁上拿T480切win10系统看电影,为了节电给细调了个省电策略(设置CPU性能30%),不知是不是因为这个原因,今天切回Ubuntu1604工作导致CPU工作频率非常低. 查阅了一下相关方法, ...

  5. cf711D. Directed Roads(环)

    题意 题目链接 \(n\)个点\(n\)条边的图,有多少种方法给边定向后没有环 Sol 一开始傻了,以为只有一个环...实际上N个点N条边还可能是基环树森林.. 做法挺显然的:找出所有的环,设第\(i ...

  6. 【代码笔记】iOS-UIAlertView自动关闭

    一,效果图. 二,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIVi ...

  7. js 回调函数理解与应用

    定义:在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A.我们就说函数A叫做回调函数.如果没有名称(函数表达式),就叫做匿名回调函 ...

  8. SD从零开始25-28

    SD从零开始25 装运的组织单元(Organizational Units in Shipping) 组织结构-后勤Organizational Structure-Logistics Plant在后 ...

  9. Android 系统中运行jar文件

    在android系统中运行jar操作步骤: 1.       打包编译jar包 2.       将jar包导入android设备中 adb push test.jar  /data/local/tm ...

  10. 2018-10-19 00:13:35 ArrayList

    获取集合元素的长度用的是size方法. 传入Object类型的值,返回boolean值的remove方法,含义是判断是否删除成功. 传入索引值的remove方法,返回的是被删除的元素. 修改值得set ...