2013-02-18 116 views
1

考慮類:手冊參考支持

class Person { 
    String name; 
    Person father; 
    Person mother; 
    List<Person> children; 
} 

有沒有一種方法來指示jongo是fathermotherchildren應該manual references到其他對象相同的集合,而不是嵌入對象內?請注意:這與DBRefs有所不同。

回答

1

還沒有。

最簡單的方法是手動發出第二個查詢。不過,你可以在解組過程中創建一個Jackson de/serializer來獲取文檔。 幾個月前,我們已經創造了unmarhsalling期間獲取DBREF秒殺,這個代碼可以幫助:Handle DBRef during (un)marshalling

隨意添加一個feature request

1

我用一種方法來處理它。不確定它是完美的,但它適用於我自己。

比方說,你有這些類

public class MyObject { 

    @Id 
    private String id; 
    private MyEmbeddedObject embeddedObject; 

    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public MyEmbeddedObject getEmbeddedObject() { 
     return this.embeddedObject; 
    } 

    public void setEmbeddedObject(MyEmbeddedObject embeddedObject) { 
     this.embeddedObject = embeddedObject; 
    } 

} 


public class MyEmbeddedObject { 

    @Id 
    private String id; 

    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

} 

你要「嵌入」和對象存儲MyEmbeddedObject在集合中集「對象」有手動提到「嵌入」集合標識。例如:

object : { id:1, embeddedObjectId: 99 } 
embed : { id : 99 } 

可以實現對MyEmbeddedObject定製串行器和解串

public class MyEmbeddedObjectSerializer extends JsonSerializer<MyEmbeddedObject> { 

    @Override 
    public void serialize(MyEmbeddedObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
     jgen.writeText(value.getId()); 
    } 
} 

public class MyEmbeddedObjectDeserializer extends JsonDeserializer<MyEmbeddedObject> { 

    @Override 
    public MyEmbeddedObject deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
     MyEmbeddedObject obj = new MyEmbeddedObject(); 
     obj.setId(jsonParser.getString()); 
     return new MyEmbeddedObject(); 

    } 
} 

如果您登記參加Jongo序列化,問題是,這將被用於MyEmbeddedObject作爲成員MyObject,但也可以在MyEmbeddedObject自己存儲在「嵌入」集合中時使用。

要僅在MyEmbeddedObject嵌入到MyOBject中時應用自定義的serizalizers /反序列化器,我使用Mixin註釋。

public interface MyObjectMixIn { 

    @JsonSerialize(using=MyEmbeddedObjectSerializer .class) 
    public MyEmbeddedObject getEmbeddedObject(); 

    @JsonDeserialize(using=MyEmbeddedObjectDeserializer.class) 
    public void setEmbeddedObject(MyEmbeddedObject embeddedObject); 

} 

然後在Jongo

定義模塊

public class MyModule extends SimpleModule { 
    @Override 
    public void setupModule(SetupContext context) { 
     context.setMixInAnnotations(MyObject.class, MyObjectMixIn.class); 
    } 
} 

Finaly註冊模塊

Jongo jongo = new Jongo(db, JacksonMapper.Builder().registerModule(new MyModule()).build()); 

現在,通過自己使用它存儲在蒙戈

  1. 商店embeddedObject在收集「嵌入」得到一個ID
  2. 確保對象的嵌入對象成員包含標識
  3. 將對象存儲在集合「對象」中。只有嵌入對象的ID將被存儲

,並讀取數據存儲

  1. 閱讀從集合「對象」的對象。嵌入對象將僅使用其ID
  2. 進行初始化如果您需要它,請閱讀「embed」集合中的embeddedObject。

編輯:避免遲緩裝載並且在反序列化加載完整的對象,從傑克遜HandlerInstantiator目的是定製串行器和解串施工機制是有用的。

希望有所幫助。