10

我想将不同的数据存储到 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"}

当我获取数据时,没关系。但是,当我从 CrudRepository 为 B调用save方法时,它会重写所有数据并且我丢失了 C。

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

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

但有反思。

你还有其他建议吗?

提前致谢。

4

2 回答 2

7

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

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

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

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

您可以在此处找到更多详细信息:https ://web.archive.org/web/20160722023804/http://www.rainydayinn.com:80/dev/dao-factory-and-generic-dao-wiring-in-spring /

如果要将所有对象存储在同一个集合中,可以使用注释 @Document (collection="mycollection")。如果不给集合名,默认是根据类名将每个类保存在单独的集合中。

于 2012-02-18T15:45:52.527 回答
0

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

public interface ClassBRepository extends MongoRepository<ClassBRepository , String> { 

}
于 2020-05-05T12:08:53.650 回答