日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MongoDB中_class字段的作用

發布時間:2025/7/25 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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字段的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。