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フレームワークには、これを実行するObject / grid Mapper(OGM)サブプロジェクトがあります。

于 2012-04-20T10:44:40.043 に答える
0

ブグモンゴ? http://code.google.com/p/bugumongo

于 2012-04-21T06:59:10.523 に答える
0

もう1つのオプションは、多形処理をJacksonに委任するJongoを使用することです。私はいくつかの例を含むブログ投稿を書きました、そしてあなたは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 に答える