【问题标题】:Spring Data MongoDb for class inheritance用于类继承的 Spring Data MongoDb
【发布时间】:2012-02-06 07:38:09
【问题描述】:

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

但有反射。

您还有其他想法吗?

提前致谢。

【问题讨论】:

  • 您介意与MongoTemplate 和您的存储库的交互更详细吗?您是否将数据读回到B 的对象中?这实际上应该返回一个C 类型的对象,因为我们应该检测存储的类型信息。除此之外,集合映射信息将很有帮助。确保所有类都映射到同一个集合。
  • 嗨奥利弗,谢谢你的回答。是的,我已经覆盖了“MongoTemplate”的“保存”方法来使用更新查询。现在当我保存“B”时,它只更新“B”字段。但我试图找到更棒的解决方案......
  • 如果您添加相关代码 sn-ps 我们可能会更深入地研究这个问题:)
  • 嗨奥利弗,很抱歉延迟回复。有我们的解决方案:gist.github.com/1631780
  • @OliverGierke 感谢所有辛勤工作! 1.0.1.RELEASE 为我解决了很多问题

标签: java mongodb spring-data mongodb-java


【解决方案1】:

对于 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")。如果不给集合名,默认是根据类名将每个类保存在单独的集合中。

【讨论】:

  • 这里给出的 URL 不再有效!请努力指向相关的。
【解决方案2】:

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

public interface ClassBRepository extends MongoRepository<ClassBRepository , String> { 

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多