2012-01-09 30 views
9

我想不同的数据存储到一个集合中的MongoDB,并与相应的字段数据春豆..春MongoDB的数据类继承

对不起,我跳过的细节。

父bean:

class A 
    int a 

柴尔兹:

class B extends A 
    double b 

class C extends A 
    String c 

因此,有以下的蒙戈

{a : 1, b : 2.3, c : "Test"} 

当我获取数据,这是确定的文件。但是,当我打电话从CrudRepository对于B 保存方法,它重写所有数据和我失去了C.

我只知道一个很好的选择,创建自定义的保存方法与增量更新,如

update.set("b", newvalue)... 

但有反思。

您有任何其他想法吗?

在此先感谢。

+1

您是否介意在与'MongoTemplate'和您的存储库的交互中稍微详细一点?你是否将数据读回到'B'的对象中?实际上应该返回一个类型为“C”的对象,因为我们应该检测存储的类型信息。除此之外,集合映射信息将会有所帮助。确保所有类都映射到相同的集合。 – 2012-01-10 08:16:22

+0

嗨奥利弗,谢谢你的回答。是的,我已经覆盖'MongoTemplate'的'save'方法来使用更新查询。现在当我保存'B'时,它只更新'B'字段。但我试图找到更多真棒解决方案... – 2012-01-10 20:14:30

+0

如果您添加相关的代码片段,我们可能会深入探讨这个问题:) – 2012-01-11 08:24:36

回答

5

对于Spring-data MongoTemplate,除了对象中的字段外,还会保存一个 附加字段名_class,它告诉模板它将保存哪个类。
使用其他对象的存储库而不管的继承关系,您将无法正确保存对象。

Spring的CrudRepository基本上是Generic Dao模式。由于所有的dao都实现了这个接口,并且有了save方法,所以你可以通过知道使用哪个dao来保存任何对象。

为此,您可以创建一个用于初始化存储库的RepositoryFactory,该存储库提供一个getRepository(Class类型)函数,为您提供适当的存储库以供您的类使用。然后,你就可以这样做:

repositoryFactory.getRepository(myType.getClass()).save(myType); 

您可以在这里找到更多的细节:http://www.rainydayinn.com/dev/dao-factory-and-generic-dao-wiring-in-spring/

如果你想存储相同的集合中的所有对象,你可以使用注解@Document(集合= “MyCollection的”)。如果您未给出集合名称,则默认情况下将根据类名称将每个类保存在单独的集合中。