MongoDB中_class字段的作用
生活随笔
收集整理的這篇文章主要介紹了
MongoDB中_class字段的作用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們知道,如果你用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;@Overridepublic 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 {@AutowiredMongoTemplate mongoTemplate;@Overridepublic void addPerson(Person person) {mongoTemplate.save(person);}@Overridepublic 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 {@AutowiredPersonDao personDao;@Testpublic void addPerson() {Person person = new Person();person.setName("張");person.setAge(10);personDao.addPerson(person);}@Testpublic void addStudent() {Student student = new Student();student.setName("小張");student.setAge(12);student.setA("a");student.setB("b");personDao.addPerson(student);}@Testpublic 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的方法可以參考其他博文。
@Beanpublic 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類。
轉載于:https://www.cnblogs.com/keeya/p/9969535.html
總結
以上是生活随笔為你收集整理的MongoDB中_class字段的作用的全部內容,希望文章能夠幫你解決所遇到的問題。