Java 用于类继承的Spring数据MongoDb

Java 用于类继承的Spring数据MongoDb,java,mongodb,spring-data,mongodb-java,Java,Mongodb,Spring Data,Mongodb Java,我想将不同的数据存储到MongoDb中的一个集合中,并使用带有适当字段的Spring数据bean 对不起,我跳过了细节 父bean: class A int a 儿童: class B extends A double b class C extends A String c 所以,在mongo中有以下文档 {a : 1, b : 2.3, c : "Test"} 当我获取数据时,它是正常的。但是,当我从crudepository为B调用save方法时,它重写了所

我想将不同的数据存储到MongoDb中的一个集合中,并使用带有适当字段的Spring数据bean

对不起,我跳过了细节

父bean:

class A
    int a
儿童:

class B extends A
    double b

class C extends A
    String c
所以,在mongo中有以下文档

{a : 1, b : 2.3, c : "Test"}
当我获取数据时,它是正常的。但是,当我从crudepository为B调用save方法时,它重写了所有数据,我丢失了C

我知道只有一个好的选项可以创建带有增量更新的自定义保存方法,例如

update.set("b", newvalue)...
但要深思熟虑

你还有别的想法吗


提前感谢。

对于Spring data MongoTemplate,除了对象中的字段之外,还有一个 另外还保存了字段名\u class,它告诉模板要保存哪个类。
无论继承关系如何,您都无法使用另一个对象的存储库正确保存对象

Spring的基本假设是通用Dao模式。由于您的所有dao都实现了接口,并且具有save方法,因此您可以通过知道使用哪个dao来保存任何对象

为此,您可以创建一个用于初始化存储库的RepositoryFactory,它提供一个getRepository(类类型)函数,为您的类提供适当的存储库。然后,您将能够执行以下操作:

repositoryFactory.getRepository(myType.getClass()).save(myType);
您可以在此处找到更多详细信息:


如果要将所有对象存储在同一集合中,可以使用注释@Document(collection=“mycollection”)。如果不提供集合名称,默认情况下会根据类名将每个类保存在单独的集合中。

我也有同样的问题,我通过在派生类中添加默认构造函数并为每个派生类使用特定的存储库来解决。

public interface ClassBRepository extends MongoRepository<ClassBRepository , String> { 

}
公共接口ClassBRepository扩展了MongoRepository{
}

在与
MongoTemplate
和您的存储库进行交互时,您是否介意再详细一点?您是否正在将数据读回
B
的对象中?这实际上应该返回一个
C
类型的对象,因为我们应该检测存储的类型信息。除此之外,集合映射信息将非常有用。确保所有类都映射到同一集合。嗨,奥利弗,谢谢你的回答。是的,我已经重写了“MongoTemplate”的“save”方法以使用更新查询。现在,当我保存“B”时,它只更新“B”字段。但我试图找到更棒的解决方案……如果您添加相关的代码片段,我们可能会更深入地探讨这个问题:)嗨,奥利弗,很抱歉延迟响应。我们的解决方案是:@OliverGierke感谢您的辛勤工作!1.0.1.RELEASE修复了Meth的许多问题此处给出的URL不再有效!请尽量指向相关的一个。