考虑一下这个类:
class Person {
String name;
Person father;
Person mother;
List<Person> children;
}有没有办法告诉jongo,father、mother和children应该是同一集合中的其他对象的manual references,而不是嵌入的对象?
注意:这不同于DBRefs。
发布于 2013-02-19 16:21:01
还没。
最简单的方法是手动发出第二个查询。
不过,您可以创建Jackson de/serializer来在解组过程中获取文档。几个月前,我们创建了一个在解组过程中获取DBRef的峰值,下面的代码可以提供帮助:Handle DBRef during (un)marshalling
您可以随意添加feature request
发布于 2013-11-05 21:56:58
我用一种方法来处理它。我不确定它是否完美,但它对我来说是有效的。
假设你有这些类
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存储在集合"embed“中,将对象存储在集合" Object”中,并手动引用"embed“集合ids。例如:
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中注册了序列化程序,问题是它将作为MyObject的成员用于MyEmbeddedObject,但当它自身存储在"embed“集合中时,它也将用于MyEmbeddedObject。
为了仅在MyOBject中嵌入MyEmbeddedObject时才应用定制的序列化/反序列化,我使用了Mixin注释。
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);
}
}最后在Jongo中注册模块
Jongo jongo = new Jongo(db, JacksonMapper.Builder().registerModule(new MyModule ()).build());现在使用它在Mongo中进行存储
中。
和读取数据存储区
编辑:为了避免延迟加载和在反序列化时加载完整的对象,来自Jackson的HandlerInstantiator对象对于定制序列化程序和反序列化程序构造机制非常有用。
希望这能有所帮助。
https://stackoverflow.com/questions/14939433
复制相似问题