-->

手册参考支持(Manual references support)

2019-10-17 18:00发布

考虑类:

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

有没有一种方法来指示jongo即fathermotherchildren应该是手动引用同一个集合,而不是嵌入对象中的其他对象?

注意:这是从不同DBREFS 。

Answer 1:

还没。

最简单的方法是手动发出第二个查询。

不过,你可以propably创建杰克逊德/串行解组过程中获取的文件。 几个月前,我们已经创建了一个尖峰的unmarhsalling期间获取DBREF,这个代码可以帮助: 在(联合国)编组处理DBREF

随意添加功能请求



Answer 2:

我用一种方法来处理它。 不知道这是完美的,但它适用于自己。

比方说,你有这些类

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 /解串器,我使用密新注解。

public interface MyObjectMixIn {

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

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

}

然后定义模块

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

Finaly登记Jongo模块

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

现在用它来存储在蒙戈

  1. 本身在收集“嵌入”获得一个ID存储embeddedObject
  2. 确保对象的embeddedObject成员包含ID
  3. 存储集“对象”的对象。 嵌入对象的唯一的ID将被存储

并读取数据存储

  1. 阅读从集合“对象”的对象。 该embeddedobject将只与它的ID被初始化
  2. 如果你需要它,阅读embeddedObject中集“嵌入”。

编辑:避免迟缓装载并且在反序列化加载完整的对象, HandlerInstantiator从杰克逊目的是定制串行器和解串施工机制是有用的。

希望帮助。



文章来源: Manual references support