哪个 Java ORM 框架支持 MongoDB 中的文档多态性?

Posted

技术标签:

【中文标题】哪个 Java ORM 框架支持 MongoDB 中的文档多态性?【英文标题】:Which Java ORM framework support polymorphism of document in MongoDB? 【发布时间】:2012-04-20 10:33:37 【问题描述】:

我正在尝试使用 MongoDB 来存储一系列文档。这些文档共享一些标准属性,但有几个变化。我们通过继承来实现 POJO。基类为 Document,下有 Invoice、Orders 等多个子类,与 Document 类相比,又多了几个字段。

class Document 
    DocTypeEnum type;
    String title;

class Invoice extends Document
    Date dueDate;

class Order extends Document
    List<LineItems> items;

是否有 ORM 框架支持查询集合并根据其类型字段返回混合对象列表(发票、订单、基本文档等)?

List<Document> results = DocCollection.find(...);

非常感谢!

【问题讨论】:

【参考方案1】:

即使不需要类型枚举或任何东西,Morhia 也支持多态性。它将实际实例类名与其余数据一起存储。看看@Polymorphic 注释。

【讨论】:

感谢您指出精彩的多态注释。另外,我注意到即使没有多态注释,它也被 Morhia 内置支持,请参阅:carfey.com/blog/using-mongodb-with-morphia【参考方案2】:

您可以使用任何支持所需数据库方言的 ORM。 hibernate 框架有 Object/grid Mapper (OGM) 子项目来做这件事。

【讨论】:

【参考方案3】:

BuguMongo? http://code.google.com/p/bugumongo

【讨论】:

【参考方案4】:

另一种选择是使用Jongo,它将多态处理委托给Jackson。我写了一个blog post 和一些例子,你可以在GitHub 找到完整的代码库。

在您的特定场景中,您使用 Jackson 的解决方案将如下所示:

public enum DocTypeEnum 
    INVOICE(Constants.INVOICE), ORDER(Constants.ORDER);

    DocTypeEnum(String docTypeString) 
    

    public static class Constants 
        public static final String INVOICE = "INVOICE";
        public static final String ORDER = "ORDER";
    


@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, 
property = Document.TYPE)
@JsonSubTypes(
    @JsonSubTypes.Type(value = Invoice.class, name = DocTypeEnum.Constants.INVOICE),
    @JsonSubTypes.Type(value = Order.class, name = DocTypeEnum.Constants.ORDER)
)
public class Document 

    public static final String TYPE = "type";
    public static final String TITLE = "title";

    private final DocTypeEnum type;
    private final String title;

    public Document(DocTypeEnum type, String title) 
        this.type = type;
        this.title = title;
    

    @JsonProperty(TYPE)
    public DocTypeEnum getType() 
        return type;
    

    @JsonProperty(TITLE)
    public String getTitle() 
        return title;
    


@JsonIgnoreProperties(ignoreUnknown = true)
public class Invoice extends Document 
    public static final String DUE_DATE = "due_date";
    private final Date dueDate;

    public Invoice(String title, Date dueDate) 
        super(DocTypeEnum.INVOICE, title);
        this.dueDate = dueDate;
    

    @JsonProperty(DUE_DATE)
    public Date getDueDate() 
        return dueDate;
    


@JsonIgnoreProperties(ignoreUnknown = true)
public class Order extends Document 

    public static final String ITEMS = "items";
    private final List<LineItems> items;

    public Order(String title, List<LineItems> items) 
        super(DocTypeEnum.ORDER, title);
        this.items = items;
    

    @JsonProperty(ITEMS)
    public List<LineItems> getItems() 
        return items;
    

【讨论】:

以上是关于哪个 Java ORM 框架支持 MongoDB 中的文档多态性?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 spring data jpa 以及它使用哪个 orm 框架?

Morphia - mongodb之ORM框架

哪个 ORM 支持多行更新和删除

Django和SQLAlchemy,哪个Python ORM更好?

哪个 Java Web 框架最适合 Google Guice? [关闭]

哪个 ORM 框架可以最好地处理 MVCC 数据库设计?