Morphia 是一个用于 MongoDB 的 Java ORM(对象关系映射)库,它允许开发者将 Java 对象映射到 MongoDB 文档中,并提供了方便的 API 来进行数据库操作。在 Morphia 中,Map
和 List
是常用的数据结构,它们可以用来存储和操作嵌套的文档数据。
在使用 Morphia 时,可能会遇到一个问题:基于泛型类型加载 Map
或 List
,但不从继承给定类型的子类加载。这意味着如果你有一个基类和一个子类,Morphia 只会加载基类的 Map
或 List
,而不会加载子类的。
这个问题通常是由于 Morphia 的类型擦除机制导致的。Java 的泛型在编译时会进行类型擦除,这意味着在运行时,Morphia 无法获取到具体的泛型类型信息,只能获取到原始类型。
@Property
或 @Type
注解来明确指定泛型的具体类型。@Entity
public class MyClass {
@Property("myMap")
private Map<String, MySubClass> myMap;
// getters and setters
}
TypeConverter
接口来自定义类型转换逻辑。public class MySubClassConverter extends TypeConverter<MySubClass> {
@Override
public MySubClass decode(Class<?> targetClass, Object fromDBObject, MappedField optionalExtraInfo) {
// 自定义解码逻辑
}
@Override
public Object encode(MySubClass value, MappedField optionalExtraInfo) {
// 自定义编码逻辑
}
}
然后在 Morphia 中注册这个转换器:
Datastore datastore = morphia.createDatastore(new MongoClient(), "database");
datastore.getMapper().getConverters().addConverter(new MySubClassConverter());
@Entity
public class MyClass {
private Map<String, MySubClass> myMap;
// getters and setters
}
通过以上方法,可以解决 Morphia 在加载 Map
或 List
时无法从继承给定类型的子类加载的问题。
领取专属 10元无门槛券
手把手带您无忧上云