MongoDB 多态性是指在 MongoDB 中存储不同类型的对象,而这些对象共享一个公共字段或接口。在 Java 中,这通常通过继承和接口实现。当使用 Java 对象映射 MongoDB 文档时,可能会遇到无法确定具体类的问题。这通常是因为 MongoDB 的文档结构无法唯一确定 Java 对象的具体类型。
在 Java 中使用 MongoDB 时,可能会遇到无法确定具体类的问题。例如:
public abstract class Animal {
private String type;
// getters and setters
}
public class Dog extends Animal {
private String breed;
// getters and setters
}
public class Cat extends Animal {
private String color;
// getters and setters
}
当从 MongoDB 中读取 Animal
类型的文档时,无法确定具体是 Dog
还是 Cat
。
MongoDB 文档中没有足够的信息来确定具体类。
@DiscriminatorKey
和 @DiscriminatorValue
注解(Spring Data MongoDB):import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.DiscriminatorKey;
import org.springframework.data.mongodb.core.mapping.DiscriminatorValue;
@Document
@DiscriminatorKey(name = "animalType")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Animal {
@Id
private String id;
private String type;
// getters and setters
}
@Document
@DiscriminatorValue("Dog")
public class Dog extends Animal {
private String breed;
// getters and setters
}
@Document
@DiscriminatorValue("Cat")
public class Cat extends Animal {
private String color;
// getters and setters
}
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("animals");
Document doc = collection.find(new Document("type", "Dog")).first();
String animalType = doc.getString("type");
Animal animal;
if ("Dog".equals(animalType)) {
animal = doc.toBsonDocument(BsonDocument.class).toJavaObject(Dog.class);
} else if ("Cat".equals(animalType)) {
animal = doc.toBsonDocument(BsonDocument.class).toJavaObject(Cat.class);
} else {
throw new IllegalArgumentException("Unknown animal type");
}
System.out.println(animal);
}
}
通过上述方法,可以解决 MongoDB 多态性 Java 对象无法确定具体类的问题。
领取专属 10元无门槛券
手把手带您无忧上云