2

我正在尝试使用 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(...);

非常感谢!

4

4 回答 4

3

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

于 2012-04-20T11:08:40.810 回答
1

您可以使用任何支持所需数据库方言的 ORM。hibernate 框架具有执行此操作的对象/网格映射器(OGM) 子项目。

于 2012-04-20T10:44:40.043 回答
0

布古蒙戈? http://code.google.com/p/bugumongo

于 2012-04-21T06:59:10.523 回答
0

另一种选择是使用Jongo将多态处理委托给Jackson。我写了一篇包含一些示例的博客文章,您可以在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;
    }
}
于 2013-10-04T07:30:55.567 回答