spring - 在spring Data中使用继承时如何检索对象
问题描述
假设我有一个如下的类结构,它是非常基本的继承:
Manager extends Person {
private String name;
Manager() {
}
}
Clerk extends Person {
private String salary;
}
在 Spring Data 中,如果我将这些存储在 Mongo 中,是否可以在执行 getById 时将其配置为映射正确的类。我想我将不得不存储一些课程信息?
我不想做的是需要创建单独的存储库类,如果我可以避免的话,我也不知道当我做 getById 时对象是什么
解决方案
如果您使用 spring-data-mongodb MongoRepository 根据您的实体模型在数据库中写入数据,_class
则会将一个字段添加到文档根和复杂的属性类型(请参阅本节)。此字段存储 Java 类的完全限定名称,并且在从 MongoDb 文档映射到 Spring 数据模型时允许消除歧义。
但是,如果您只使用MongoRepository从数据库中读取数据,则需要告诉 Spring-data 如何显式映射您的实体。您将需要使用 Explicit Converters 覆盖映射。
PersonReadConverter.class
public class PersonReadConverter implements Converter<Document, Person> {
@Override
public Contact convert(Document source) {
if (source.get("attribute_specific_to_Clerk") != null) {
Clerk clerk = new Clerk();
//Set attributes using setters or defined constructor
return clerk;
}
else {
Manager manager = new Manager()
//Set attribute using setters or defined constructor
return manager;
}
}
}
然后,您必须使用 MongoConverter 注册 Spring 转换器。
您可以在以下位置找到我自己的示例:Spring Data Mongo - 如何映射继承的 POJO 实体?
推荐阅读
- deep-learning - 如何从pytorch中的优化器获取/打印正则化损失/ l2损失/重量衰减值?
- kendo-ui - 从 Api 调用 Angular 7 的剑道网格保存和取消操作
- glusterfs - 0-glusterfs:设置 volfile 服务器失败:文件存在
- qt - 在 Windows 10 中构建 ParaView 自定义应用程序时出错
- c++ - 如何使用四个 FMVECTOR 构建 XMMATRIX
- android - 如果音乐位于外部 SD 卡中,则 Android Q 中的 ContentValues 更新失败
- python - 使用 python 从 SQL 表或文本文件中提取日期时间
- java - 尽管具有 CORS 功能,但 Spring 应用程序响应 406
- node.js - nodejs postgres查询在事务查询后返回未定义
- git - 如何通过 url 获取特定的分支?吉特