gpt4 book ai didi

java - 用于类继承的 Spring Data MongoDb

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:53 27 4
gpt4 key购买 nike

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

抱歉,我跳过了细节。

父 bean :

class A
int a

children :

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)...

但有反射(reflection)。

你还有其他想法吗?

提前致谢。

最佳答案

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

Spring 的 CrudRepository 本质上是 Generic Dao 模式。由于您的所有 Dao 都实现了该接口(interface)并具有保存方法,因此您可以通过知道使用哪个 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")。如果不给集合名,默认是将每个类按照类名保存在单独的集合中。

关于java - 用于类继承的 Spring Data MongoDb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com