Spring Data Mongodb-用于收集不同类型的存储库
我有一个mongo集合,其中可能包含我映射到Java类型的三种类型的实体:
- 节点
- LeafType1
- LeafType2
收集是使用父条目中的子节点的dbRefs存储树状结构。
我没有在Spring参考文档中找到有关主题的任何信息,所以我在这里问:有没有一种方法可以使用Repository
机制来处理可能包含不同类型对象的集合?
在一个集合中声明多个用于不同类型的存储库似乎不是一个好主意,因为我经常遇到以下情况:查询的对象不是预期类型,并且为抽象类创建一个所有可能的类型继承都不起作用的存储库。
为了说明我的意思:
/**
* This seems not safe
*/
public interface NodeRepository extends MongoRepository<Node, String> { }
public interface LeafType1Repository extends MongoRepository<LeafType1, String> { }
public interface LeafType2Repository extends MongoRepository<LeafType2, String> { }
/**
* This doesn't work at all
*/
public interface MyCollectionRepository extends MongoRepository<AbstractMyCollectionNode, String> { }
-
如果Node \ LeafType1 \
LeafType2是AbstractMyCollectionNode的子类,那么事情将会很容易。只需像编写时那样声明存储库:public interface MyCollectionRepository extends MongoRepository<AbstractMyCollectionNode, String> { }
我们已经在一个项目中做到了这一点,并且效果很好。Spring Data将在mongodb集合中的文档中添加一个名为“
_class”的属性,以便可以指出要实例化的类。存储在一个集合中的文档可能有一些相似之处,也许您可以为它们提取一个通用类。
以下是从我们的项目之一复制的一些代码:
实体:
public abstract class Document { private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } ....
public class WebClipDocument extends Document { private String digest; ...
仓库:
public interface DocumentDao extends MongoRepository<Document, String>{ ...
并且 ,如果您的mongodb集合中的文档不具有“
_class”属性。您可以使用Converter:在存储和查询对象时,让MongoConverter实例处理所有Java类型到DBObjects的映射很方便。但是,有时您可能希望MongoConverter完成大部分工作,但允许您有选择地处理特定类型的转换或优化性能。