【问题标题】:Which Java ORM framework support polymorphism of document in MongoDB?哪个 Java ORM 框架支持 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(...);

非常感谢!

【问题讨论】:

    标签: java mongodb orm


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          • 2013-01-30
          • 1970-01-01
          • 2015-06-07
          • 1970-01-01
          • 2011-10-09
          • 1970-01-01
          相关资源
          最近更新 更多