2013-02-18 66 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目的是定制串行器和解串施工机制是有用的。

希望有所帮助。